我对Python不太熟悉,但是一直在尝试拟合经典谐波振荡器的三种不同能量曲线。我发现了一种方法,如果我想通过曲线拟合获得更多效果,那不是最有效的方法。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy import optimize
import sympy as sy
dU=np.zeros(2)
def oscil(U,t):
dU[0]=U[1]
dU[1]=-U[0]-b*U[1]
return dU
ic = [0,1] #initial condition
t = np.linspace(0,100,1000) #time
#4 different graphs with different beta, B, values; B=[0,0.1,0.5,1]
b=0
soln1 = odeint(oscil, ic, t)
b=0.1
soln2 = odeint(oscil, ic, t)
b=0.5
soln3 = odeint(oscil, ic, t)
b=1
soln4 = odeint(oscil, ic, t)
#Create 4 subplbots
fig, ( (plt1,plt2), (plt3,plt4) ) = plt.subplots(2,2)
fig.subplots_adjust(wspace=0.4, hspace=0.8)
plt1.plot(t, soln1[:,0], label='position')
plt1.plot(t, soln1[:,1], label='velocity')
plt1.set_title('Undamped Harmonic Oscillator')
plt1.set_xlim(-1,4*np.pi)
plt1.set_xlabel('Time')
plt2.plot(t, soln2[:,0], label='position')
plt2.plot(t, soln2[:,1], label='velocity')
plt2.set_title('Damped HO for B=0.1')
plt2.set_xlabel('Time')
plt3.plot(t, soln3[:,0], label='position')
plt3.plot(t, soln3[:,1], label='velocity')
plt3.set_title('Damped HO for B=0.5')
plt3.set_xlim(-1,50)
plt3.set_xlabel('Time')
plt4.plot(t, soln4[:,0], label='position')
plt4.plot(t, soln4[:,1], label='velocity')
plt4.set_title('Damped HO for B=1')
plt4.set_xlim(-1,20)
plt4.set_xlabel('Time')
plt.title('HMO with Driving Force')
plt.legend(loc='best')
plt.show()
# Energy = x^2 + dxdt^2
Energy1 = soln1[:,0]**2+soln1[:,1]**2
Energy2 = soln2[:,0]**2+soln2[:,1]**2
Energy3 = soln3[:,0]**2+soln3[:,1]**2
Energy4 = soln4[:,0]**2+soln4[:,1]**2
# curve fit
x=t
y2=Energy2
y3=Energy3
y4=Energy4
def mod2(x, xshift, steepness, yshift): ###estimated function
return xshift*np.exp(-steepness*x) + yshift
init_vals2 = [1.11913923, 0.11376818, 0.0826447 ]
init_vals3 = [1.21244276, 0.57442609, 0.07596321 ]
init_vals4 = [1.04292458, 0.90770071, 0.06833576]
fitParams2, fitCovariances = optimize.curve_fit(mod2, x, y2, p0=init_vals2)
fitParams3, fitCovariances = optimize.curve_fit(mod2, x, y3, p0=init_vals3)
fitParams4, fitCovariances = optimize.curve_fit(mod2, x, y4, p0=init_vals4)
plt.plot(t,y2, t,y3, t,y4)
plt.plot(t,mod2(x,*fitParams2), 'k' )
plt.plot(t,mod2(x,*fitParams3), 'k' )
plt.plot(t,mod2(x,*fitParams4), 'k' )
plt.title('Energy')
plt.xlabel('t')
plt.show()
我想要类似的东西
y = [Energy2, Energy3, Energy4]
mod=[mod2, mod2, mod2]
p0= [init_vals2,init_vals3,init_vals4]
for i in range(0,2):
fitParams, fitCovariances= optimize.curve_fit(mod[i], x, y[i], p0[i])
for i in range (0,3):
plt.plot(t,y[i])
for i in range (0,2):
plt.plot(t, mod[i+1](x, *fitParams), 'k')
plt.show()
但是,它只能拟合一条曲线。我似乎在这里找不到其他解决方案。谢谢!