【问题标题】:Ordinary differential equations Matlab and finding a value using Heun's method常微分方程 Matlab 和使用 Heun 方法求值
【发布时间】:2015-10-09 23:15:00
【问题描述】:

如何求解以下 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);

【问题讨论】:

  • 我会将其更改为 $g' = F(t,g)$ 形式的一阶 ODE 系统,然后使用 Huen 的方法解决该问题。使用 MATLAB 求解二阶 ODE 有一些答案。
  • 这是 Heun 的方法,说话像 Hoin。中点法的显式变体。
  • @LutzL Wikipedia 将其作为改进的欧拉方法给出,而不是明确的中点。
  • 你说得对,我又把它们弄混了。 Heun 是显式梯形法。

标签: matlab ode


【解决方案1】:

Runge-Kutta 方法(如 Heun 方法)是为一阶微分方程或系统定义的。由于您的方程是二阶的,因此第一个任务是将其转换为一阶系统: 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

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2012-11-14
    • 2016-03-15
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多