import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as si
import scipy.interpolate as interp
from array import *
import math
#f(x,y)
def f(x,y):
return -y - x**2
def Adams(x, y, num, h):
for i in range(num-1):
y.insert(len(y), Euler(y,x,h))
F = [f(x[0],y[0]), f(x[1],y[1]), f(x[2],y[2]), f(x[3],y[3])]
coef = 24
for i in range(len(x)):
if i >= (len(y)):
y.insert(i, y[i-1] + h/coef*(55*F[3] - 59*F[2] + 37*F[1] - 9*F[0]))
for j in range(3):
F[j] = F[j+1]
F[3] = f(x[i],y[i])
return y
#Метод эйлера
def Euler(y, x, h):
return y[len(y)-1] + h*f(x[len(y) - 1], y[len(y) - 1])
def RRKM(b, h, e):
y = array('f', [10])
x = array('f', [0])
k = array('f', [0,0,0,0,0,0])
flag = 0
while x[len(x) - 1]<=b:
while True:
k[1] = h*f(x[len(y) - 1], y[len(y) - 1])
k[2] = h*f(x[len(y) - 1] + 1/3*h, y[len(y) - 1] +1/3*k[1])
k[3] = h*f(x[len(y) - 1] + 1/3*h, y[len(y) - 1] + 1/6*k[1] + 1/6*k[2])
k[4] = h*f(x[len(y) - 1] + 1/2*h, y[len(y) - 1] + 1/8*k[1] + 3/8*k[3])
k[5] = h*f(x[len(y) - 1] + h, y[len(y) - 1] + 1/2*k[1] - 3/2*k[3] + 2*k[4])
q=(8*k[4] - 9*k[3] - k[5] + 2*k[1])/30
if abs(q)<e*abs(y[len(y) - 1]):
break
h = h/2
x.insert(len(x), x[len(x) - 1] + h)
y.insert(len(y), y[len(y) - 1] + 1/6*k[1] + 2/3*k[4] + 1/6*k[5])
if abs(q)<=e*abs(y[len(y) - 1])/32:
h = h*2
return x,y
def RK4(x, h, b, n):
y = array('f', [10])
k = array('f', [0,0,0,0,0])
while len(y)!=len(x):
k[1] = f(x[len(y) - 1], y[len(y) - 1])
k[2] = f(x[len(y) - 1] + 1/2*h, y[len(y) - 1] + h*k[1]/2)
k[3] = f(x[len(y) - 1] + 1/2*h, y[len(y) - 1] + h*k[2]/2)
k[4] = f(x[len(y) - 1] + h, y[len(y) - 1] + h*k[3])
y.insert(len(y), y[len(y) - 1] +h*(k[1] + 2*k[2] + 2*k[3] + k[4])/6)
return y
print ("Введите кол-во шагов")
h = int(input())
a = 0
print ("Введите конец интервала")
b = int(input())
print ("Введите точность")
e = float(input())
y1 = array('f')
x, step = np.linspace(a, b, h, True, True)
y1 = -x*x + 2*x - 2 + 12*math.e**(-x)
y = array('f', [10])
yA = array('f', [10])
yRKM = array('f', [10])
for i in x:
if i != x[len(x)-1]:
y.insert(len(y), Euler(y, x, step))
yA = Adams(x,yA,5,step)
xRKM,yRKM = RRKM(b, step, e)
yRK4 = RK4(x, step, b, h)
fig, ax = plt.subplots()
ax.set_xlim(0,5)
ax.set_ylim(-20,20)
ax.set_title("Графики")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.plot(x, y, color = 'g', label = 'Euler')
ax.plot(x, yRK4, color = 'y', label = 'RK4')
ax.plot(x, yA, color = 'c', label = 'Adams')
ax.plot(xRKM,yRKM, color = 'm', label = 'RKM')
ax.scatter(xRKM,yRKM,c = 'deeppink')
ax.plot(x, y1, color = 'r', label = 'Solution')
ax.legend()
plt.show()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHNjaXB5LmludGVncmF0ZSBhcyBzaQppbXBvcnQgc2NpcHkuaW50ZXJwb2xhdGUgYXMgaW50ZXJwCmZyb20gYXJyYXkgaW1wb3J0ICoKaW1wb3J0IG1hdGgKCiNmKHgseSkKZGVmIGYoeCx5KToKICAgIHJldHVybiAteSAtIHgqKjIKCmRlZiBBZGFtcyh4LCB5LCBudW0sIGgpOgogICAgZm9yIGkgaW4gcmFuZ2UobnVtLTEpOgogICAgICAgIHkuaW5zZXJ0KGxlbih5KSwgRXVsZXIoeSx4LGgpKQogICAgRiA9IFtmKHhbMF0seVswXSksIGYoeFsxXSx5WzFdKSwgZih4WzJdLHlbMl0pLCBmKHhbM10seVszXSldCiAgICBjb2VmID0gMjQKICAgIGZvciBpICBpbiByYW5nZShsZW4oeCkpOgogICAgICAgIGlmIGkgPj0gIChsZW4oeSkpOgogICAgICAgICAgICB5Lmluc2VydChpLCB5W2ktMV0gKyBoL2NvZWYqKDU1KkZbM10gLSA1OSpGWzJdICsgMzcqRlsxXSAtIDkqRlswXSkpCiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDMpOgogICAgICAgICAgICAgICAgRltqXSA9IEZbaisxXQogICAgICAgICAgICBGWzNdID0gZih4W2ldLHlbaV0pCiAgICByZXR1cm4geQoKCiPQnNC10YLQvtC0INGN0LnQu9C10YDQsApkZWYgRXVsZXIoeSwgeCwgaCk6CiAgcmV0dXJuIHlbbGVuKHkpLTFdICsgaCpmKHhbbGVuKHkpIC0gMV0sIHlbbGVuKHkpIC0gMV0pIAoKICAgICAKZGVmIFJSS00oYiwgaCwgZSk6CiAgICAgeSA9IGFycmF5KCdmJywgWzEwXSkKICAgICB4ID0gYXJyYXkoJ2YnLCBbMF0pCiAgICAgayA9IGFycmF5KCdmJywgWzAsMCwwLDAsMCwwXSkKICAgICBmbGFnID0gMAoKICAgICB3aGlsZSB4W2xlbih4KSAtIDFdPD1iOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGtbMV0gPSBoKmYoeFtsZW4oeSkgLSAxXSwgeVtsZW4oeSkgLSAxXSkKICAgICAgICAgICAga1syXSA9IGgqZih4W2xlbih5KSAtIDFdICsgMS8zKmgsIHlbbGVuKHkpIC0gMV0gKzEvMyprWzFdKQogICAgICAgICAgICBrWzNdID0gaCpmKHhbbGVuKHkpIC0gMV0gKyAxLzMqaCwgeVtsZW4oeSkgLSAxXSArIDEvNiprWzFdICsgMS82KmtbMl0pCiAgICAgICAgICAgIGtbNF0gPSBoKmYoeFtsZW4oeSkgLSAxXSArIDEvMipoLCB5W2xlbih5KSAtIDFdICsgMS84KmtbMV0gKyAzLzgqa1szXSkKICAgICAgICAgICAga1s1XSA9IGgqZih4W2xlbih5KSAtIDFdICsgaCwgeVtsZW4oeSkgLSAxXSArIDEvMiprWzFdIC0gMy8yKmtbM10gKyAyKmtbNF0pCiAgICAgICAgICAgIHE9KDgqa1s0XSAtIDkqa1szXSAtIGtbNV0gKyAyKmtbMV0pLzMwCiAgICAgICAgICAgIGlmIGFicyhxKTxlKmFicyh5W2xlbih5KSAtIDFdKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGggPSBoLzIKICAgICAgICB4Lmluc2VydChsZW4oeCksIHhbbGVuKHgpIC0gMV0gKyBoKQogICAgICAgIHkuaW5zZXJ0KGxlbih5KSwgeVtsZW4oeSkgLSAxXSArIDEvNiprWzFdICsgMi8zKmtbNF0gKyAxLzYqa1s1XSkKICAgICAgICBpZiBhYnMocSk8PWUqYWJzKHlbbGVuKHkpIC0gMV0pLzMyOgogICAgICAgICAgICBoID0gaCoyCiAgICAgcmV0dXJuIHgseQoKZGVmIFJLNCh4LCBoLCBiLCBuKToKICAgIHkgPSBhcnJheSgnZicsIFsxMF0pCiAgICBrID0gYXJyYXkoJ2YnLCBbMCwwLDAsMCwwXSkKICAgIHdoaWxlIGxlbih5KSE9bGVuKHgpOgogICAgICAgIGtbMV0gPSBmKHhbbGVuKHkpIC0gMV0sIHlbbGVuKHkpIC0gMV0pCiAgICAgICAga1syXSA9IGYoeFtsZW4oeSkgLSAxXSArIDEvMipoLCB5W2xlbih5KSAtIDFdICsgaCprWzFdLzIpCiAgICAgICAga1szXSA9IGYoeFtsZW4oeSkgLSAxXSArIDEvMipoLCB5W2xlbih5KSAtIDFdICsgaCprWzJdLzIpCiAgICAgICAga1s0XSA9IGYoeFtsZW4oeSkgLSAxXSArIGgsIHlbbGVuKHkpIC0gMV0gKyBoKmtbM10pCiAgICAgICAgeS5pbnNlcnQobGVuKHkpLCB5W2xlbih5KSAtIDFdICtoKihrWzFdICsgMiprWzJdICsgMiprWzNdICsga1s0XSkvNikKICAgIHJldHVybiB5CgoKCgpwcmludCAoItCS0LLQtdC00LjRgtC1INC60L7Quy3QstC+INGI0LDQs9C+0LIiKQpoID0gaW50KGlucHV0KCkpCmEgPSAwCgpwcmludCAoItCS0LLQtdC00LjRgtC1INC60L7QvdC10YYg0LjQvdGC0LXRgNCy0LDQu9CwIikKYiA9IGludChpbnB1dCgpKQoKcHJpbnQgKCLQktCy0LXQtNC40YLQtSDRgtC+0YfQvdC+0YHRgtGMIikKZSA9IGZsb2F0KGlucHV0KCkpCnkxID0gYXJyYXkoJ2YnKQp4LCBzdGVwID0gbnAubGluc3BhY2UoYSwgYiwgaCwgVHJ1ZSwgVHJ1ZSkKeTEgPSAteCp4ICsgMip4IC0gMiArIDEyKm1hdGguZSoqKC14KQp5ID0gYXJyYXkoJ2YnLCBbMTBdKQp5QSA9IGFycmF5KCdmJywgWzEwXSkKeVJLTSA9IGFycmF5KCdmJywgWzEwXSkKCgpmb3IgaSBpbiB4OgogICAgaWYgaSAhPSB4W2xlbih4KS0xXToKICAgICAgICB5Lmluc2VydChsZW4oeSksIEV1bGVyKHksIHgsIHN0ZXApKQoKeUEgPSBBZGFtcyh4LHlBLDUsc3RlcCkKeFJLTSx5UktNID0gUlJLTShiLCBzdGVwLCBlKQp5Uks0ID0gUks0KHgsIHN0ZXAsIGIsIGgpCgoKCmZpZywgYXggPSBwbHQuc3VicGxvdHMoKQpheC5zZXRfeGxpbSgwLDUpCmF4LnNldF95bGltKC0yMCwyMCkKYXguc2V0X3RpdGxlKCLQk9GA0LDRhNC40LrQuCIpCmF4LnNldF94bGFiZWwoIngiKQpheC5zZXRfeWxhYmVsKCJ5IikKYXgucGxvdCh4LCB5LCBjb2xvciA9ICdnJywgbGFiZWwgPSAnRXVsZXInKQpheC5wbG90KHgsIHlSSzQsIGNvbG9yID0gJ3knLCBsYWJlbCA9ICdSSzQnKQpheC5wbG90KHgsIHlBLCBjb2xvciA9ICdjJywgbGFiZWwgPSAnQWRhbXMnKQpheC5wbG90KHhSS00seVJLTSwgY29sb3IgPSAnbScsIGxhYmVsID0gJ1JLTScpCmF4LnNjYXR0ZXIoeFJLTSx5UktNLGMgPSAnZGVlcHBpbmsnKQpheC5wbG90KHgsIHkxLCBjb2xvciA9ICdyJywgbGFiZWwgPSAnU29sdXRpb24nKQpheC5sZWdlbmQoKQpwbHQuc2hvdygpCg==