Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from math import *
- import numpy as np
- import matplotlib.pyplot as plt
- #Диф.уравнение
- def difur (x,y):
- return (x*(y**2)-y)
- #Метод Эйлера
- def fx (du, x_0,y_0,x_k,n_1):
- h= (x_k-x_0) /n_1
- xlist, ylist=[],[]
- for i in range (0,n_1):
- y1=y_0+h*du (x_0,y_0)
- x1=x_0+h
- x_0=x1
- y_0=y1
- xlist.append(x_0)
- ylist.append(y_0)
- return xlist, ylist
- # метод рунге-кутта
- def rk (du, x_0,y_0,x_k,n_1):
- h= (x_k-x_0) /n_1
- xlist, ylist=[],[]
- for i in range (0,n_1):
- k1=h*du (x_0,y_0)
- k2=h*du (x_0+h/2,y_0+k1/2)
- k3=h*du (x_0+h/2,y_0+k2/2)
- k4=h*du (x_0+h,y_0+k3)
- y1=y_0+ (k1+2*k2+2*k3+k4) /6
- x_0=x_0+h
- y_0=y1
- xlist.append(x_0)
- ylist.append(y_0)
- return xlist, ylist
- def TochnoeReshenie(f,a,y0,b,n):
- res=[]
- h=(b-a)/n
- ilist = np.arange(0, n, 1)
- xlist = [(a+h*i) for i in ilist]
- for x in xlist:
- func = 1/(exp(x)+x+1)
- res.append(func)
- return res
- def calc_y1 (du, x0, y0, xk, n):
- try:
- rx, ry = rk(du,x0,y0,xk,n)
- ex, ey = fx(du,x0,y0,xk,n)
- plt.plot(ex, ey, rx, ry)
- plt.xlabel('t')
- plt.ylabel('y')
- plt.legend(('метод Эйлера','метод Рунге-Кутта 4-го порядка'), loc=2)
- plt.grid(True)
- plt.show()
- except:
- print('Неверно заданы значения')
- #x0 - величина начального значения числа X
- #y0 - величина начального значения числа Y
- #xk - величина конечной точки
- #n - точность интегрирования
- x0, y0, xk, n = 0, 1, 2, 30
- calc_y1(difur, x0, y0, xk, n)
- plt.plot(TochnoeReshenie(difur, x0, y0, xk, n), "r-", label="точное решение")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement