Advertisement
Mockingblrd

Untitled

Nov 14th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.03 KB | None | 0 0
  1. import math as m
  2. #import numpy as np
  3.  
  4. def myfunc(x):
  5.     return m.cos(x)*x
  6.  
  7.  
  8. def f(x, g):
  9.     return m.cos(x) - m.sin(x)*x + k * (g - myfunc(x))
  10.  
  11.  
  12. def absErr(arr):
  13.     abserr = [abs(myfunc(x[i]) - arr[i]) for i in range(0, N+1)]
  14.     return abserr
  15.  
  16.  
  17. def globerr(arr):
  18.     return max(absErr(arr))
  19.  
  20.  
  21. def k1(i, t):
  22.     return f(x[i-1], t[i-1])
  23.  
  24.  
  25. def k2(i, t):
  26.     return f(x[i-1] + h/2, t[i-1] + k1(i, t) * h/2)
  27.  
  28.  
  29. def k3a(i, t):
  30.     return f(x[i-1] + h, t[i-1] - h * k1(i, t) + 2 * h * k2(i, t))
  31.  
  32.  
  33. def k3b(i, t):
  34.     return f(x[i-1] + h / 2, t[i-1] + h * k2(i, t) / 2)
  35.  
  36.  
  37. def k4(i, t):
  38.     return f(x[i-1] + h, t[i-1] + h * k3b(i, t))
  39.  
  40.  
  41. def euler():
  42.     euler = start.copy()
  43.     for i in range(1, N+1):
  44.         euler[i] = euler[i-1] + h * f(x[i-1], euler[i-1])
  45.     return euler
  46.  
  47.  
  48. def rka():
  49.     rka = start.copy()
  50.     for i in range(1, N+1):
  51.         rka[i] = rka[i-1] + h * (k1(i, rka) + 4 * k2(i, rka) * k3a(i, rka)) / 6
  52.     return rka
  53.  
  54.  
  55. def rkb():
  56.     rkb = start.copy()
  57.     for i in range(1, N+1):
  58.         rkb[i] = rkb[i-1] + h * (k1(i, rkb) + 2 * k2(i, rkb) + 2 * k3b(i, rkb) + k4(i, rkb)) / 6
  59.     return rkb
  60.  
  61.  
  62. def adams_a():
  63.     adams_a = startrka.copy()
  64.     for i in range(4, N+1):
  65.         adams_a[i] = adams_a[i-1] + (h/24) * (55 * f(x[i-1], adams_a[i-1]) - 59 * f(x[i-2], adams_a[i-2]) +
  66.                                               37 * f(x[i-3], adams_a[i-3]) - 9 * f(x[i-4], adams_a[i-4]))
  67.     return adams_a
  68.  
  69.  
  70. def adams_b():
  71.     adams_b = startrkb.copy()
  72.     for i in range(4, N+1):
  73.         adams_b[i] = adams_b[i-1] + (h/24) * (55 * f(x[i-1], adams_b[i-1]) - 59 * f(x[i-2], adams_b[i-2]) +
  74.                                               37 * f(x[i-3], adams_b[i-3]) - 9 * f(x[i-4], adams_b[i-4]))
  75.     return adams_b
  76.  
  77.  
  78. def abm_a():
  79.     predicta = adams_a().copy()
  80.     abm_a = startrka.copy()
  81.     for i in range(4, N+1):
  82.         abm_a[i] = abm_a[i-1] + h * (9 * f(x[i], predicta[i]) + 19 * f(x[i-1], abm_a[i-1]) -
  83.                                      5 * f(x[i-2], abm_a[i-2]) + f(x[i-3], abm_a[i-3]))
  84.     return abm_a
  85.  
  86.  
  87. def abm_b():
  88.     predictb = adams_b().copy()
  89.     abm_b = startrkb.copy()
  90.     for i in range(4, N+1):
  91.         abm_b[i] = abm_b[i-1] + h * (9 * f(x[i], predictb[i]) + 19 * f(x[i-1], abm_b[i-1]) -
  92.                                      5 * f(x[i-2], abm_b[i-2]) + f(x[i-3], abm_b[i-3]))
  93.     return abm_b
  94.  
  95.  
  96. def gir_a():
  97.     gir_a = startrka.copy()
  98.     for i in range(4, N+1):
  99.         gir_a[i] = (48 * gir_a[i-1] - 36 * gir_a[i-2] + 16 * gir_a[i-3] -
  100.                     3 * gir_a[i-4] + 12 * h * m.cos(x[i]) - m.sin(x[i])*x[i] - k * myfunc(x[i])) / (25 - k)
  101.     return gir_a
  102.  
  103.  
  104. def gir_b():
  105.     gir_b = startrkb.copy()
  106.     for i in range(4, N+1):
  107.         gir_b[i] = (48 * gir_b[i-1] - 36 * gir_b[i-2] + 16 * gir_b[i-3] -
  108.                     3 * gir_b[i-4] + 12 * h * (m.cos(x[i]) - m.sin(x[i])*x[i] - k * myfunc(x[i]))) / (25 - k * 12 * h)
  109.     return gir_b
  110.  
  111.  
  112. def pred_corr():
  113.     pred = start.copy()
  114.     corr = [0 for i in range(0, N+1)]
  115.     corr[0] = pred[0]
  116.     stop = 1e-2
  117.     for i in range(1, N+1):
  118.         while abs(corr[i] - pred[i])/abs(pred[i]) <= stop:
  119.             pred[i] = pred[i-1] + h * f(x[i-1], pred[i-1])
  120.             corr[i] = corr[i-1] + (h/2) * (f(x[i-1], corr[i-1]) + f(x[i], pred[i]))
  121.    
  122.  
  123. k = 5
  124. N = 1000
  125. h = 2 / N
  126. x = [-1 + i * h for i in range(N+1)]
  127. y = [0 for i in range(N+1)]
  128. y[0] = myfunc(x[0])
  129. start = [0 for i in range(0, N+1)]
  130. start[0] = myfunc(x[0])
  131. startrka = [0 for i in range(0, N+1)]
  132. startrkb = [0 for i in range(0, N+1)]
  133. for i in range(0, 4):
  134.     startrka[i] = rka()[i]
  135.     startrkb[i] = rkb()[i]
  136. #plot = open('J:\Test2\ ' + str(N) + '.txt', 'w')
  137. #for i in range(N+1):
  138. #    plot.write(str(x[i]) + ' ' + str(myfunc(x[i])) + ' ' + str(adams_a()[i]) + '\n')
  139. #plot.close()
  140. test = open('J:\Test\ ' + str(N) + '.txt', 'w')
  141. test.write(str(globerr(euler())) + ' ' + str(globerr(rka())) + ' ' + str(globerr(rkb())) + ' ' +
  142.            str(globerr(adams_a())) + ' ' + str(globerr(adams_b())) + ' ' + str(globerr(gir_b())) + '\n')
  143. test.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement