Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.75 KB | None | 0 0
  1. import numpy as np
  2. import copy
  3. from scipy import optimize
  4. import scipy.linalg as sla
  5. from sympy import *
  6.  
  7. y0 = 1/10
  8. t0 = 1
  9. T = 2
  10. N = 10
  11. step = (T-t0)/N
  12. s1 = 0.20230885
  13. s2 = 0.34733149
  14. nodeT = np.zeros(N + 1)
  15. for ind in range(0, N + 1):
  16.     nodeT[ind] = t0 + step * ind
  17.  
  18. def ExatSolve():
  19.     u = Function('u')
  20.     t = symbols('t')
  21.     ans = dsolve(u(t).diff(t)-((3*u(t))/(2*t)+(3*t*(u(t)**(1/3)))/2), u(t))
  22.     # ans = dsolve(u(t).diff(t)-(2*t*(u(t)**3))/(1-(t*u(t))**2), u(t))
  23.     pprint(ans)
  24.     Constant = solve([ans.rhs.subs(t, t0)-y0])
  25.     pprint(Constant[0])
  26.     C1 = symbols('C1')
  27.     ans = ans.subs(Constant[0])
  28.     pprint(ans)
  29.     arr = np.zeros(N+1)
  30.     for ind in range(N+1):
  31.         arr[ind] = list(solve(ans.subs(t, nodeT[ind]))[0].items())[0][1]
  32.         print("В точке t = {0}, значение u({0}) = {1}.".format(nodeT[ind], arr[ind]))
  33.     return arr
  34. exat_list = ExatSolve()
  35.  
  36.  
  37. nodeT = np.zeros(N + 1)
  38. for ind in range(0, N + 1):
  39.     nodeT[ind] = t0 + step * ind
  40.  
  41. def Function(t, u):
  42.     return (3*u)/(2*t)+(3*t*(u**(1/3)))/2
  43.     # return (2*t*(u**3))/(1-(t*u)**2)
  44. def EulerObv():
  45.     solution = np.zeros(N+1)
  46.     solution[0] = y0
  47.     for ind in range(0, N):
  48.         solution[ind+1] = solution[ind]+step*Function(nodeT[ind], solution[ind])
  49.     return solution
  50.  
  51.  
  52. def EulerUnObv():
  53.     solution = np.zeros(N+1)
  54.     solution[0] = y0
  55.     for ind in range(0, N):
  56.         solution[ind+1] = optimize.root(lambda ans: -ans +  solution[ind]+step*Function(nodeT[ind+1], ans), solution[ind]).x[0]
  57.     return solution
  58.  
  59. def RassingOrderFull(size):
  60.     B = np.zeros(size*2)
  61.     for ind in range(size*2):
  62.         B[ind] = 1 / (1 + ind)
  63.     def equations(p):
  64.         A = np.array(list(p)[:size])
  65.         alpha = np.array(list(p)[size:])
  66.         ans = np.zeros(size*2)
  67.         for ind in range(size*2):
  68.             ans[ind] = (A*(alpha**ind)).sum()
  69.         ans = ans-B
  70.         return tuple(ans)
  71.  
  72.  
  73.     tup = optimize.root(equations, np.zeros(size*2)).x
  74.     A = tup[:size]
  75.     alpha = tup[size:]
  76.     print(A)
  77.     print(alpha)
  78.  
  79. def RaisingOrder():
  80.     # def NormFunction(X, u):
  81.     #     return Function(X+1)
  82.     # q = 2
  83.     # alpha = np.array([0, 1/2])
  84.     # A = np.array([0, 1])
  85.     solution = np.zeros(N + 1)
  86.     solution[0] = y0
  87.     for ind in range(0, N):
  88.         solution[ind + 1] = solution[ind] + Function(nodeT[ind]+step/2, solution[ind]+step*Function(nodeT[ind], solution[ind])/2) * step
  89.     return solution
  90.  
  91.  
  92. def Bucher1(x, y):
  93.     s = 2
  94.     C = np.array([0, 2/3])
  95.     A = np.array([[0, 0], [2/3, 0]])
  96.     B = np.array([1/4, 3/4])
  97.     # s = 1
  98.     # C = np.array([0])
  99.     # A = np.array([[0]])
  100.     # B = np.array([1])
  101.  
  102.     K = np.zeros(s)
  103.     for ind in range(s):
  104.         to_y = (K*A).sum()
  105.         K[ind] = Function(x+step*C[ind], y + step*to_y)
  106.     return (K*B).sum()
  107.  
  108. def RungeKutBuch():
  109.     solution = np.zeros(N + 1)
  110.     solution[0] = y0
  111.     for ind in range(0, N):
  112.         solution[ind + 1] = solution[ind] + step * Bucher1(nodeT[ind], solution[ind])
  113.     return solution
  114.  
  115. def Adams3():
  116.     solution = np.zeros(N + 1)
  117.     solution[0] = y0
  118.     solution[1] = s1
  119.     solution[2] = s2
  120.  
  121.     for ind in range(0, N-1):
  122.         value = solution[ind+1] + step * ((2/3)*Function(nodeT[ind+1], solution[ind+1]) - (1/12)*Function(nodeT[ind], solution[ind]))
  123.         solution[ind + 2] = optimize.root(lambda ans:
  124.                                           ans-step*5/12*Function(nodeT[ind+2], ans)-value,
  125.                                           solution[ind+1]).x[0]
  126.     return solution
  127.  
  128. print("Решение искалось в точках")
  129. print(nodeT)
  130. print()
  131.  
  132. print("Метод Адамса третьего порядка")
  133. res = Adams3()
  134. print(res)
  135. print("Невязка c Точным решение")
  136. print(abs(res-exat_list))
  137. print()
  138. print()
  139. print("Неявный метод Эйлера")
  140. eul = EulerUnObv()
  141. print(eul)
  142. print("Невязка c методом А")
  143. print(abs(eul-res))
  144. print("Невязка c Точным решение")
  145. print(abs(eul-exat_list))
  146. print()
  147. print("Явный метод Эйлера")
  148. eul = EulerObv()
  149. print(eul)
  150. print("Невязка c методом А")
  151. print(abs(eul-res))
  152. print("Невязка c Точным решение")
  153. print(abs(eul-exat_list))
  154. print()
  155. print("Метод Рунге-Кутта")
  156. ruk = RungeKutBuch()
  157. print(ruk)
  158. print("Невязка c методом А")
  159. print(abs(ruk-res))
  160. print("Невязка c Точным решение")
  161. print(abs(ruk-exat_list))
  162. print()
  163. print()
  164. print("Последовательного повышения точности")
  165. ro = RaisingOrder()
  166. print("Невязка c методом А")
  167. print(abs(ro-res))
  168. print("Невязка c Точным решение")
  169. print(abs(ro-exat_list))
  170. print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement