[英]Ordinary differential equations Matlab and finding a value using Heun's method
如何解決以下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);
像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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.