在Python Matplotlib中绘制一个变化值的多条曲线



我正在编写一个Euler方法,当";h〃;或者步长改变其值,而不为每个h创建新的变量。有简单的方法吗?

这是我的代码,之后是我想要的图形示例。谢谢

from math import exp
import numpy as np
from matplotlib import pyplot as plt
sol = lambda x: exp(x**2/2)
dy = lambda x,y: x*y #Ecuacion Dif
sol2 = np.vectorize(sol)
x = 0 #intervalo
xn = 2 #intervalo mayor
y = 1 #VALOR INICIAL
h = 0.5 #STEP SIZE
n = int((xn - x)/h)
print("x tt y(Euler)t y (Analitica)")
print("{0} t {1} t {2}".format(x,y,sol(x)))
yg = [y]
xg = [x]
xr = np.arange(0,n*h,0.01)
for i in range(n):
y += dy(x,y)*h
yg.append(y)
x += h
xg.append(x)
print("{0:.5f} t {1:.5f} t {2:.5f}".format(x,y,sol(x)))
plt.plot(xr,sol2(xr),color='k',label='Analitca')
plt.plot(xg,yg,color='b',label="h = 0.5")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Metodo de Euler')
plt.legend()
plt.grid(True)
plt.savefig('Euler_Metodo.png')
plt.show()

我想要的图形

这是我做了一些工作后所做的。我希望有人觉得它有帮助!

from math import exp
import numpy as np
from matplotlib import pyplot as plt
sol = lambda x: exp(x**2/2)
dy = lambda x,y: x*y #Ecuacion Dif
sol2 = np.vectorize(sol)
x = 0 #intervalo
xn = 2 #intervalo mayor
y = 1 #VALOR INICIAL
h = [1,0.5,0.2,0.05,0.01] #dif values h
nlista = []
for valor in range(len(h)):
x = 0
nlista.append(int((xn - x)/h[valor]))
print(nlista)
for j in range(len(h)):
x = 0
y = 1
yg = [1]
xg = [0]

for i in range(nlista[j]):

y += dy(x,y)*h[j]
yg.append(y)
x += h[j]
xg.append(x)
#print("{0:.5f} t {1:.5f} t {2:.5f}".format(x,y,sol(x)))

plt.plot(xg,yg,label="h = {0}".format(h[j]))
plt.xlabel('x')
plt.ylabel('y')
plt.title('Metodo de Euler')

xr = np.arange(0,2,0.01)
plt.plot(xr,sol2(xr),color='k',label='Analitca')
plt.legend()
plt.grid(True)
plt.savefig('Euler_Metodo.png')
plt.show()

结果如下:

结果

相关内容

最新更新