我想知道我的Matlab代码是否存在解决二阶微分方程的问题。等式为y" + cy< + 12.5y = 2.5cos(wt)。这是我正在使用的代码:
function [ dydt ] = order2( t,y )
dydt = zeros(size(y));
c=2.5;
%c=0.25;
%c=0.025;
w=sqrt(12.5-(c^2/4));
a = 2.5;
b = 12.5;
r = 2.5*cos(w*t);
dydt(1) = y(2);
dydt(2) = r -a*y(2) - b*y(1);
end
输入命令窗口的代码:
>> tspan = [0 40];
y0 = [1,2];
[t,y]=ode45(@order2,tspan,y0);
plot(t,y(:,1))
问题是,这段代码确实有效(它输出图形),但是当我使用每个c值时,它产生的图形看起来几乎相同。我认为图表之间会有显着差异。结果是否几乎相同或者我的代码是否有用?
答案 0 :(得分:1)
如果你正确地实现了方程,那么确实a=c
和数值方程实际上代表了共振情况,那么你也得到3个不同的图。下面是一个图表。可以看出饱和振幅如何取决于摩擦系数,低摩擦大振幅和vv。
b = 12.5;
def derivs(y,t,c):
w = (b-c**2/4)**0.5
return [ y[1], 2.5*np.cos(w*t) - c*y[1] - b*y[0] ]
tspan = np.linspace(0,20,501)
cs = [2.5, 0.25, 0.025 ]
sols = [ odeint(lambda y,t: derivs(y,t,c), [1.,2.], tspan) for c in cs]
for c,sol in zip(cs, sols): plt.plot(tspan, sol[:,0], label="c=%6f"%c)
plt.legend(loc="best");plt.show()