bainhomeRe:[呼吁]:常微分,偏微分方程的数值解法高手请参与本贴的讨论,谢谢!
正餐第三道:四阶runge-kutta法程序
function fun_ode_runge_kutta_4
%建立三阶runge-kutta公式,使用其中的一个特例
xn=0:.1:1;
y0=1;
y_n=[];
for i=1:length(xn)-1
K1=y0-2*xn(i)/y0;
K2=y0+.5*diff(xn([1:2]))*K1-2*(xn(i)+.5*diff(xn([1:2])))/(y0+.5*diff(xn([1:2]))*K1);
K3=y0+.5*diff(xn([1:2]))*K2-2*(xn(i)+.5*diff(xn([1:2])))/(y0+.5*diff(xn([1:2]))*K2);
K4=y0+diff(xn([1:2]))*K3-(2*xn(i)+2*diff(xn([1:2])))/(y0+diff(xn([1:2]))*K3);
y_n=[y_n;y0+1/6*diff(xn([1:2]))*(K1+2*K2+2*K3+K4)];
y0=y_n(end);
end
%精确的解析解
dy=dsolve('Dy=y-2*x/y','y(0)=1','x');
y_exact=subs(dy,'x',{.1:.1:1});
% 精度比较
y_compare=[y_n';y_exact];
y_compare_minor=[y_compare(2,:)-y_compare(1,:)];
var_y=var(y_compare_minor');
这个例子引自仿真论坛,希望对你有有帮助。关键是需要自己看书搞清楚原理,matlab实现起来就没多难了,好多书上有介绍。 |