Advertisement
myloyo

№10 Метод неопределенных коэффициентов решения краевой задачи для ОДУ 2-го порядка

Dec 12th, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.95 KB | None | 0 0
  1. def f(x):
  2.     V = 8
  3.     return 4 * pow(x, 4) - 3 * V * pow(x, 3) + 6 * x - 2 * V
  4.  
  5. def p(x):
  6.     return x * x
  7.  
  8. def q(x):
  9.     return x
  10.  
  11. def check_y(x):
  12.     V = 8
  13.     return x * x * (x - V)
  14.  
  15. def phi(x, k):
  16.     k += 1
  17.     T = 8
  18.     return pow(x, k + 1) * (x - T)
  19.  
  20. def phi1(x, k):
  21.     k += 1
  22.     T = 8
  23.     return pow(x, k + 1) * (k + 2) - pow(x, k) * (k + 1) * T
  24.  
  25. def phi2(x, k):
  26.     k += 1
  27.     T = 8
  28.     return pow(x, k) * (k + 2) * (k + 1) - pow(x, k - 1) * (k + 1) * k * T
  29.  
  30. def gauss(sole):
  31.     n = len(sole)
  32.     m = len(sole[0])
  33.     x_coords = list(range(n))
  34.  
  35.     for j in range(m - 1):
  36.         mx = j
  37.         for i in range(j, n):
  38.             if abs(sole[i][j]) > abs(sole[mx][j]):
  39.                 mx = i
  40.  
  41.         if abs(sole[mx][j]) < 1e-6:
  42.             print("Division by zero!")
  43.             return []
  44.  
  45.         sole[j], sole[mx] = sole[mx], sole[j]
  46.  
  47.         mx = j
  48.         for i in range(j, n):
  49.             if abs(sole[j][i]) > abs(sole[j][mx]):
  50.                 mx = i
  51.  
  52.         x_coords[j], x_coords[mx] = x_coords[mx], x_coords[j]
  53.  
  54.         for i in range(n):
  55.             sole[i][mx], sole[i][j] = sole[i][j], sole[i][mx]
  56.  
  57.         if abs(sole[j][mx]) < 1e-6:
  58.             print("Division by zero!")
  59.             return []
  60.  
  61.         for i in range(j + 1, n):
  62.             d = sole[i][j] / sole[j][j]
  63.             for k in range(m):
  64.                 sole[i][k] -= sole[j][k] * d
  65.  
  66.     for j in range(n - 1, -1, -1):
  67.         for i in range(j - 1, -1, -1):
  68.             d = sole[i][j] / sole[j][j]
  69.             sole[i][j] -= sole[j][j] * d
  70.             sole[i][m - 1] -= sole[j][m - 1] * d
  71.  
  72.     s = [0] * n
  73.     for i in range(n):
  74.         s[x_coords[i]] = sole[i][m - 1] / sole[i][i]
  75.  
  76.     return s
  77.  
  78. def gauss_with_rhs(A, B):
  79.     for i in range(len(A)):
  80.         A[i].append(B[i])
  81.     return gauss(A)
  82.  
  83. def print_result(vx, vy):
  84.     k = 10
  85.     for i in range(0, len(vx), k):
  86.         m = min(i + k, len(vx))
  87.         for j in range(i, m):
  88.             print(f"{vx[j]:.5f}\t", end="")
  89.         print()
  90.  
  91.         for j in range(i, m):
  92.             print(f"{vy[j]:.5f}\t", end="")
  93.         print()
  94.  
  95.         for j in range(i, m):
  96.             print(f"{check_y(vx[j]):.5f}\t", end="")
  97.         print()
  98.  
  99.         for j in range(i, m):
  100.             print(f"{vy[j] - check_y(vx[j]):.5f}\t", end="")
  101.         print()
  102.  
  103.         print()
  104.  
  105. def solve():
  106.     n = 5
  107.     l, r = 0, 8  # T = V = 16
  108.     h = (r - l) / (n + 1)
  109.     vx = [l + i * h for i in range(1, n + 1)]
  110.     A = [[0] * n for _ in range(n)]
  111.     B = [0] * n
  112.     for j in range(n):
  113.         x = vx[j]
  114.         for k in range(n):
  115.             A[j][k] = phi2(x, k) + p(x) * phi1(x, k) + q(x) * phi(x, k)
  116.         B[j] = f(x)
  117.  
  118.     va = gauss_with_rhs(A, B)
  119.     vx.insert(0, 0)
  120.     vx.append(8)
  121.     vy = [0] * len(vx)
  122.     for i in range(len(vx)):
  123.         for k in range(n):
  124.             vy[i] += va[k] * phi(vx[i], k)
  125.  
  126.     print_result(vx, vy)
  127.  
  128. if __name__ == "__main__":
  129.     solve()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement