向各位大神求救啊!这个我需要二阶Runge-Kutta方法的matlab程序!个人不懂matlab!
答案:2 悬赏:50
解决时间 2021-02-09 19:08
- 提问者网友:房东的猫
- 2021-02-09 08:24
向各位大神求救啊!这个我需要二阶Runge-Kutta方法的matlab程序!个人不懂matlab!
最佳答案
- 二级知识专家网友:心痛成瘾
- 2021-02-09 09:30
function [x,y]=Runge_kutta2(f,a,b,x0)
%2阶Runge_kutta解微分方程
%调用格式同ode45,
%f为微分方程函数,a b为积分区间,x0初值
%h为步长,默认为0.001
%例子
%odefun=@(t,x)[-10*x(1)*x(3)+x(2);10*x(1)*x(3)-x(2);-10*x(1)*x(3)+x(2)-2*x(3)];
%[t,y]=ode45(odefun,[0 10],[50 0 40]);
%[t1,y1]=Runge_kutta2(odefun,0,10,[50 0 40]);
%subplot(2,1,1),plot(t,y);legend('a-t','b-t','c-t');title('ode45')
%subplot(2,1,2),plot(t1,y1);legend('a-t','b-t','c-t');title('Runge_kutta2')
h=0.001;
p=0.32;
lamda=p;
xk=a:h:b;
n=(b-a)/h+1;
a=ones(length(x0),1);
y1(:,1)=x0';
for i=1:n
x1=xk(i)*a;
k1=f(x1,y1(:,i));
k2=f(x1+p*h*a,y1(:,i)+p*k1*h);
y1(:,i+1)=y1(:,i)+((1-lamda)*k1+lamda*k2)*h;
y(i,:)=y1(:,i)';
end
x=xk;
%2阶Runge_kutta解微分方程
%调用格式同ode45,
%f为微分方程函数,a b为积分区间,x0初值
%h为步长,默认为0.001
%例子
%odefun=@(t,x)[-10*x(1)*x(3)+x(2);10*x(1)*x(3)-x(2);-10*x(1)*x(3)+x(2)-2*x(3)];
%[t,y]=ode45(odefun,[0 10],[50 0 40]);
%[t1,y1]=Runge_kutta2(odefun,0,10,[50 0 40]);
%subplot(2,1,1),plot(t,y);legend('a-t','b-t','c-t');title('ode45')
%subplot(2,1,2),plot(t1,y1);legend('a-t','b-t','c-t');title('Runge_kutta2')
h=0.001;
p=0.32;
lamda=p;
xk=a:h:b;
n=(b-a)/h+1;
a=ones(length(x0),1);
y1(:,1)=x0';
for i=1:n
x1=xk(i)*a;
k1=f(x1,y1(:,i));
k2=f(x1+p*h*a,y1(:,i)+p*k1*h);
y1(:,i+1)=y1(:,i)+((1-lamda)*k1+lamda*k2)*h;
y(i,:)=y1(:,i)';
end
x=xk;
全部回答
- 1楼网友:专属的偏见
- 2021-02-09 09:44
其实自己写一个rk4的程序是比较无聊的(保存为rk4.m,或下载附件):
function [x,y] = rk4(f,x0,y0,h)
% 四阶runge-kutta程序
% f - 函数句柄
% x0=[x1,x2] - 求解范围
% y0 - 初值
% h - 计算步长
x = (x0(1):h:x0(2))';
y = zeros(length(x),length(y0));
y(1,:) = y0;
for i = 1:length(x)-1
k1 = f(x(i),y(i,:));
k2 = f(x(i)+1/2*h, y(i,:)+1/2*h*k1);
k3 = f(x(i)+1/2*h, y(i,:)+1/2*h*k2);
k4 = f(x(i)+h, y(i,:)+h*k3);
y(i+1,:) = y(i,:) + h/6*(k1+2*k2+2*k3+k4);
end
然后在命令窗口调用(初值随便取的):
f=@(x,y)[y(2) -16*y(1)];
[x,y]=rk4(f,[0 10],[1 2],0.1);
plot(x,y)
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯