我已经尝试过使用方程式系统来让Python解决和绘图,但是绘图无法正确显示。 这是我的代码:
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
#function that returns dx/dt and dy/dt
def func(z,t):
for r in range(-10,10):
beta=2
gamma=0.8
c = z[0]
tau = z[1]
dcdt = r*c+c**2-c**3-beta*c*tau**2
dtaudt = -gamma*tau+0.5*beta*c*tau
return [dcdt,dtaudt]
#inital conditions
z0 = [2,0]
#time points
t = np.linspace(0,24,100)
#solve ODE
z = odeint(func,z0,t)
#seperating answers out
c = z[:,0]
tau = z[:,1]
print(z)
#plot results
plt.plot(t,c,'r-')
plt.plot(t,tau,'b--')
plt.legend(['c(t)','tau(t)'])
plt.show()
让我解释一下。我正在研究双扩散对流。我不希望对r的值做任何假设,但beta和gamma是正数。所以我想给它们赋值,而不给r赋值。 这是我从了解问题中得到的图,该图不正确。 tau图绝对不应卡在0上,而c图应该做更多。我是Python的新手,现在正在学习课程,但我确实想了解我做错了什么,因此希望能以简单的语言提供帮助。
答案 0 :(得分:0)
我发现您应该检查的2个问题。
for r in range(-10,10):
在这里,您正在做一个for循环,只是重新评估dcdt和dtaudt。结果,输出值与评估r = 9(循环中的最后一个值)相同
dtaudt = -gamma*tau+0.5*beta*c*tau
这里有dtaudt = tau*(beta*c/2. -gamma)
。您选择的tau[0]=0
表示tau将保持为0。
尝试一下:
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
r = 1
beta=2
gamma=0.8
#function that returns dx/dt and dy/dt
def func(z,t):
c = z[0]
tau = z[1]
dcdt = r*c+c**2-c**3-beta*c*tau**2
dtaudt = -gamma*tau+0.5*beta*c*tau
print(dtaudt)
return [dcdt,dtaudt]
#inital conditions
z0 = [2,0.2] #tau[0] =!0.0
#time points
t = np.linspace(0,24,100)
#solve ODE
z = odeint(func,z0,t)
#seperating answers out
c = z[:,0]
tau = z[:,1]
#plot results
plt.plot(t,c,'r-')
plt.plot(t,tau,'b--')
plt.legend(['c(t)','tau(t)'])
plt.show()