在 Python Matplotlib 中绘制一个变化值的多条曲线
Plot multiple curves of one changing value in Python Matplotlib
我正在编写欧拉方法,我想在“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 \t\t 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()
Graph that I'd like
这是我在工作之后所做的。我希望有人觉得它有用!
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()
结果如下:
RESULTS
我正在编写欧拉方法,我想在“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 \t\t 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()
Graph that I'd like
这是我在工作之后所做的。我希望有人觉得它有用!
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()
结果如下:
RESULTS