帮我看下这个matlab程序为什么可以求解微分方程组不能求解微分方程?
请帮我看一下这个matlab程序,可以求解微分方程组,不能求解微分方程,这是怎么回事?%marunge4s.mfunction[x,y]=marunge4s(dyfun,...
请帮我看一下这个matlab程序,可以求解微分方程组,不能求解微分方程,这是怎么回事?
%marunge4s.m
function [x,y]=marunge4s(dyfun,xspan,y0,h)
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(dyfun,x(n),y(:,n));
k2=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
比如求解这个微分方程用这个程序如何实现,谢谢
dy/dx=2/3*x*y^(-2)
y(0)=1
0<=x<=1.2
h=0.4
谢谢! 展开
%marunge4s.m
function [x,y]=marunge4s(dyfun,xspan,y0,h)
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(dyfun,x(n),y(:,n));
k2=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
比如求解这个微分方程用这个程序如何实现,谢谢
dy/dx=2/3*x*y^(-2)
y(0)=1
0<=x<=1.2
h=0.4
谢谢! 展开
2个回答
展开全部
我和楼上的真有缘,呵呵。又来一起了。
他的方法可以的,不过为了安全起见,个人建议改一下:
f(x,y)=inline('2/3*x*y^-2');
这样可以保证你的函数能接收两个参数,即便是这种情况:
f=x也可以,因为他没有y,inline后就是x的函数,不能接收两个参数。
我并补充我的处理办法:
%marunge4s.m
function [x,y]=marunge4s(xspan,y0,h) %%这里不用那个函数作为参数;
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(@dyfun,x(n),y(:,n)); %加上@表示调用这个函数;
k2=feval(@dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(@dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(@dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
%%%%%%%%%%%%%%%%%%%%
另外写一个函数如下:并保存为.m文件。
function f=dyfun(x,y)
f=2/3*x*y^(-2);%对不同的导数函数只要改它就可以了。可以用于方程组。
他的方法可以的,不过为了安全起见,个人建议改一下:
f(x,y)=inline('2/3*x*y^-2');
这样可以保证你的函数能接收两个参数,即便是这种情况:
f=x也可以,因为他没有y,inline后就是x的函数,不能接收两个参数。
我并补充我的处理办法:
%marunge4s.m
function [x,y]=marunge4s(xspan,y0,h) %%这里不用那个函数作为参数;
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(@dyfun,x(n),y(:,n)); %加上@表示调用这个函数;
k2=feval(@dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(@dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(@dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
%%%%%%%%%%%%%%%%%%%%
另外写一个函数如下:并保存为.m文件。
function f=dyfun(x,y)
f=2/3*x*y^(-2);%对不同的导数函数只要改它就可以了。可以用于方程组。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [x,y]=marunge4s(dyfun,xspan,y0,h)
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(dyfun,x(n),y(:,n));
k2=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab下输入
f=inline('2/3*x*y^-2');
[x,y]=marunge4s(f,xspan,y0,h)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [x,y]=marunge4s(dyfun,xspan,y0,h)
%4阶龙格库塔通用程序
%dyfun为向量函数f(x,y),xspan为求解区间[x0,xn]
%y0为初始向量,h为步长,x返回节点,y返回数值解向量
x=xspan(1):h:xspan(2);
y=zeros(length(y0),length(x));
y(:,1)=y0(:);
for n=1:(length(x)-1)
k1=feval(dyfun,x(n),y(:,n));
k2=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k1);
k3=feval(dyfun,x(n)+h/2,y(:,n)+h/2*k2);
k4=feval(dyfun,x(n+1),y(:,n)+h*k3);
y(:,n+1)=y(:,n)+h*(k1+2*k2+2*k3+k4)/6;
end
x=x';
y=y';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab下输入
f=inline('2/3*x*y^-2');
[x,y]=marunge4s(f,xspan,y0,h)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询