普通微分方程Matlab并使用Heun方法求值

时间:2015-10-09 23:15:01

标签: matlab ode

如何解决以下ODE:f''+ t * f'+ 3 * f = sin(3 * t) 在t = 0,f = 2和df / dt = 1的初始条件下,使用(Dt)= 0.1间距绘制从t = 0到5的解。还使用Heun方法求解值f(5)。

以下是我在下面尝试的内容

time=(0:0.01:5);
Sol=[0];
f=[2];
df=[1];
for(mm=1:length(time)-1);
   f(mm+1)=df(mm)*.01+f(mm);
   df(mm+1)=(f(mm+1)-f(mm))/0.01;
end
ww=(1);  
for(kk=0:0.01:5-0.02);   
V=(f(ww+2)-2*f(ww+1)+f(ww))/(0.01)^2+kk*((f(ww+2)-f(ww+1))/0.01)+f(ww+1);
    Sol=[Sol V];
    ww=ww+1;
end
Sol=[Sol 0];
figure(5)
plot(time,Sol);

1 个答案:

答案 0 :(得分:3)

像Heun的方法一样,Runge-Kutta方法是为一阶微分方程或系统定义的。由于你的方程是二阶的,第一个任务是将它转换为一阶系统: f'' + t*f' + 3*f = sin(3*t)被转换为 y1(t) = f(t)y2(t) = f'(t)与衍生品 y1'(t) = y2(t)y2'(t) = f''(t) = sin(3*t) - t*y2(t) - 3*y1(t)

function dy = odefunc(t,y)
    dy = [ y(2); sin(3*t) - t*y(2) - 3*y(1) ]
end function

然后,您可以在固定步长为

的迭代中执行Heun方法
t0 = 0
tf = 5
y0 = [1; 2]

N=50
Dt = (tf - t0)/N

y = y0
t=t0
Sol = [y0]
time = [t0]
for i = 1:N
    k1 = odefunc(t,y)
    k2 = odefunc(t+Dt, y+k1*Dt)
    y = y + 0.5*Dt*(k1+k2)
    t = t + Dt
    Sol = [Sol y]
    time = [time t]
end