Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.13 KB | None | 0 0
  1. from math import acos, cos, sqrt, pi, fabs, log, ceil
  2. import sympy as sp
  3. import numpy as np
  4.  
  5.  
  6. def cardano(a, b, c, d):
  7.     p = c/a - b*b/(3*a*a)
  8.     q = 2*b*b*b/(27*a*a*a) - b*c/(3*a*a) + d/a
  9.  
  10.     Q = (p/3)**3 + (q/2)**2
  11.     if Q >= 0:
  12.         print("WARNING : discriminant >= 0 !!!")
  13.  
  14.     phi = acos(3*q/(2*p) * sqrt(-3/p))
  15.  
  16.     y1 = 2 * sqrt(-p/3) * cos(phi/3)
  17.     y2 = 2 * sqrt(-p/3) * cos(phi/3 + 2*pi/3)
  18.     y3 = 2 * sqrt(-p/3) * cos(phi/3 - 2*pi/3)
  19.  
  20.     return [y1 - b/(3*a), y2 - b/(3*a), y3 - b/(3*a)]
  21.  
  22.  
  23. def gauss3(func_x, a, b, alpha, _a):
  24.     # степень полинома = 3
  25.     n = 3
  26.     # подсчет весовых моментов
  27.     mu = [((b - _a) ** (i - alpha + 1) - (a - _a) ** (i - alpha + 1)) / (i - alpha + 1) for i in range(2*n)]
  28.  
  29.     # матрица и вектор для нахождения коэф. полинома
  30.     system_matrix = [[mu[j + s] for j in range(n)] for s in range(n)]
  31.     system_vector = [- mu[s] for s in range(n, 2*n)]
  32.  
  33.     # коэф. полинома
  34.     pol_coef = np.linalg.solve(system_matrix, system_vector)
  35.  
  36.     # решение полинома
  37.     sol = cardano(1, pol_coef[n-1], pol_coef[n-2], pol_coef[n-3])
  38.  
  39.     # новая система - для нахождения коэф. формулы Ai
  40.     system_matrix = [[sol[j]**s for j in range(n)] for s in range(n)]
  41.     system_vector = [mu[s] for s in range(n)]
  42.  
  43.     # коэф. формулы
  44.     A_coef = np.linalg.solve(system_matrix, system_vector)
  45.  
  46.     # новая функция - от t
  47.     func_t = lambda t: func_x(t + _a)
  48.  
  49.     # значение интеграла
  50.     integral_sum = sum([A_coef[i] * func_t(sol[i]) for i in range(n)])
  51.     return integral_sum
  52.  
  53.  
  54. def compound_gauss(function, a, b, alpha, step):
  55.     func_x = sp.lambdify(x, function, "math")
  56.  
  57.     intervals_number = ceil((b - a) / step)
  58.     v = np.linspace(a, b, intervals_number + 1)
  59.  
  60.     integral_sum = sum([gauss3(func_x, v[j], v[j + 1], alpha, a) for j in range(intervals_number)])
  61.     return integral_sum
  62.  
  63.  
  64. def richardson(function_expr, a, b, alpha, start_step, eps):
  65.     L, n = 2, 3
  66.     step = start_step
  67.     iterations = 0
  68.  
  69.     while True:
  70.         iterations += 1
  71.         h = [step, step/L, step/(L**2)]
  72.         sh = [compound_gauss(function_expr, a, b, alpha, h[i]) for i in range(n)]
  73.         m = - (log(fabs((sh[2] - sh[1]) / (sh[1] - sh[0]))) / log(L))
  74.  
  75.         system_matrix = [[1, - (h[i]**m), - (h[i]**(m+1))] for i in range(n)]
  76.         sol = np.linalg.solve(system_matrix, sh)
  77.  
  78.         if (sol[1]*(h[-1]**m) + sol[2]*(h[-1]**(m + 1))) < eps:
  79.             print("       J =", sol[0])
  80.             print("min step =", h[-1])
  81.             print("max step =", h[0])
  82.             print("       m =", m)
  83.             print("    iter =", iterations)
  84.             return sol[0]
  85.  
  86.         step = h[-1]/L
  87.  
  88.  
  89. x = sp.symbols('x')
  90. sp.init_printing(use_unicode=True)
  91.  
  92. function1 = 6*sp.cos(1.5*x)*sp.exp(5*x/3) + 2*sp.sin(0.5*x)*sp.exp(-1.3*x) + 5.4*x
  93.  
  94. a, b = 3.5, 3.7
  95. alpha = 2/3
  96. integral_value = 2308.2875247384072
  97. eps = 10e-6
  98.  
  99. step = b - a
  100. print("С шага:", step)
  101. richardson(function1, a, b, alpha, step, eps)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement