matlab编程问题利用欧拉方法求常微分方程近似数值解

作者&投稿:仲孙废 (若有异议请与网页底部的电邮联系)
求助过路的matlab大神,老师留作业:用两种欧拉方法解常微分方程~

欧拉方法的matlab
先定义函数euler
function [x,y]=euler(fun,x0,xfinal,y0,n);
if nargin<5,n=50;
end
h=(xfinal-x0)/n;
x(1)=x0;y(1)=y0;
for i=1:n
x(i+1)=x(i)+h;
y(i+1)=y(i)+h*feval(fun,x(i),y(i));
end
再把你的方程改写成一阶方程组,然后定义成函数fun
最后调用就行了,你试试看。

1.新建一个m文件,编写隐式Euler法的程序:
function [x,y]=Implicit_Euler(odefun,xspan,y0,h,varargin)
% 隐式Euler公式求解常微分方程
% 输入参数:
% ---odefun:微分方程的函数描述
% ---xspan:求解区间[x0,xn]
% ---y0:初始条件
% ---h:迭代步长
% ---p1,p2,…:odefun函数的附加参数
% 输出参数:
% ---x:返回的节点,即x=xspan(1):h:xspan(2)
% ---y:微分方程的数值解
x=xspan(1):h:xspan(2);
y(1)=y0;
for k=1:length(x)-1
z0=y(k)+h*feval(odefun,x(k),y(k),varargin{:});
z1=inf;
while abs(z1-z0)>1e-4
z1=y(k)+h*feval(odefun,x(k+1),z0,varargin{:});
z0=z1;
end
y(k+1)=z1;
end
x=x;y=y;

2.在命令窗口直接调用上面的程序,求解常微分问题:
(1)
f=@(t,x)-2*x;
[t,x]=Implicit_Euler(f,[0 5],1,0.1);
t1=0:0.1:5;
x1=exp(-2*t);
plot(t1,x1)
hold on
plot(t,x,'k.-','markersize',16)
legend('解析解','隐式Euler求解结果')
xlabel('t');ylabel('x');

(2)此题你给出的初值好像有问题吧,x0=0的话,求解的结果都是为0,所以我改用x0=1求解试了一下:
>> f=@(t,x)x*sin(t)-2*x^2;
>> [t,x]=Implicit_Euler(f,[0 1],1,0.01);
>> [t1,x1]=Implicit_Euler(f,[0 1],1,0.001);
>> e=x1(end)-x(end)
e =
-0.0029

>> plot(t,x,'r:')
>> hold on
>> plot(t1,x1,'g--')
>> xlabel('t');ylabel('x')
>> legend('积分步长为0.01','积分步长为0.001')
>>

%欧拉法解一阶常微分方程
% y'=xy^(1/3)

f = inline('x*y^(1/3)','x','y');
figure; hold on;
for h = [0.1 0.05 0.01]       %三个步长
    xleft = 1;     %区域的左边界
    xright = 5;     %区域的右边界
    xx = xleft:h:xright;   %一系列离散的点
    n = length(xx);    %点的个数

    y0 = 1;
    Euler = y0;
    for i = 2:n
     Euler(i)=Euler(i-1)+h*f(xx(i-1),Euler(i-1));
    end
    plot(xx,Euler,'LineWidth',2);
end

%精确解
y = ((xx.^2+2)/3).^(3/2);
plot(xx,y,'r','LineWidth',2);
grid on;



clear all;clc

odefun=inline('x*y^(1/3)','x','y');

[t,y]=Euler(odefun,[0,6],1,0.01) 

%[t,y]=Euler(odefun,tspan,y0,h)

%odefun——微分方程函数f(x,y)

%tspan——(x0,xf)初值x0,终值xf

%y0——初始值

%h——步长

%t——节点向量

%y——数值解

x1=0:0.1:6;

y1=((x1.^2+2)/3).^1.5;

plot(t,y,'r-',x1,y1,'k*-'),grid on,xlabel('x'),ylabel('y'),legend('解曲线','精确解')




Matlab编程问题
仔细看了下算法,有以下问题:1、dr\/dγ=0求出的未必是极值点,也可能是驻点。2、函数很可能是多峰值的,这种方法似乎欠妥。3、请给出具体的数据t、F(t),否则自己设置数据编写的程序未必能适应你的问题。

matlab编程问题
function [ distance path] = Dijk( W,st,e )%DIJK Summary of this function goes here% W 权值矩阵 st 搜索的起点 e 搜索的终点n=length(W);%节点数D = W(st,:);visit= ones(1:n); visit(st)=0;parent = zeros(1,n);%记录每个节点的上一个节点path =[];for i=1...

一道Matlab编程题
1. 首先举一个简单的例子:求y=x^2 ,在x为[0,2]上的曲线长度。把下面的复制粘贴进MATLAB syms t x=t;y=t^2;df=@(t)(1+4*t.^2).^0.5; %%MATLAB早期版本不支持@功能 quad(df,0,1)答案ans=1.4789 2. 再回答你的问题:clc clear syms t x=sin (t);y=t^2;z=log(t...

matlab编程问题
clear allA=[1 2 3 3 2 5 7 8 5];B=[9 8 6 -6 -8 2 7 0 -2];disp([A',B'])for i=1:1:length(B)-1 temp = B(i); for j=i+1:1:length(B) if abs(temp) == abs(B(j)) A(j) = -1; B(j) = -1; A(i) = -1; B(i) = -1...

matlab编程问题 ,求解求解
x=[0 0.25 0.5 0.75 1];y=[0.916 0.811 0.693 0.56 0.406];p=polyfit(x,y,1);x1=p(1)*0.7+p(2);x2=p(1)*0.5+p(2);

matlab数学软件编程问题
n=input('n=','s')for i=1:n a(i)=(i.*(i+1))\/2;if (a(i)<=n)b(i,1:i)=1:i;end end b,c=sum(b')'例如n=100,输出结果:b为连加的数(所有表示方法),c为加的结果 (连续若干个自然数的和的数)

Matlab的简单编程问题
你是要分别画sin(x)和cos(x)的图像,但是你却使用了一个plot函数,plot函数是将所有点一笔连成的,所以在画完sin(x)之后,又回到点(0,1)开始画cos(x)的图像了。可以这样改:x=linspace(0,2*pi,100);y1=sin(x);y2=cos(x);plot(x, y1, x, y2)...

一道关于matlab编程的问题
function fmincon1 x0=[10 10 10]A=[-1 0 0;0 1 0;0 0 -1;0 -1 0] %标准形:-x1<=-30;x2<=50;-x3<=0;-x2<=0;B=[-30;50;0;0]Aeq=[1 1 1]%x1+x2+x3=120 Beq=120 [X,FVAL,EXITFLAG]= fmincon(@mfun,x0,A,B,Aeq,Beq)function z=mfun(x)z=6*x(1)+3...

关于matlab求一个简单的定积分的编程,哪里出问题了
问题可能是x与y不“独立”,是相关的。如下代码可用。a=rand(1,1000000);%生成1行1000列共1000个0到1之间的小数b = rand(1,1000000);%生成1行1000列共1000个0到1之间的小数x=a*4;%将a映射到0到4之间(包括4)y=b*3;%将b映射到0到3之间(包括3)n=0;for i=1:1000000 if y(i...

求教matlab编程问题,求矩阵中的未知量
这样的问题实际就是用matlab解方程组。可以试试使用solve命令解决 syms x [x^2+x x^3+5;x x+6]*[x^3 1;x^2-1 x]*[3;0]ans = 3*(x^2+x)*x^3+3*(x^3+5)*(x^2-1)3*x^4+3*(x+6)*(x^2-1)则用 [x,y]=solve('3*(x^2+x)*x^3+3*(x^3+5)*(x^2-1)...

日喀则市18862322894: matlab编程问题利用欧拉方法求常微分方程近似数值解 -
李洋刻迪: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23%欧拉法解一阶常微分方程 % y'=xy^(1/3)f = inline('x*y^(1/3)','x','y'); figure; hold on; forh = [0.1 0.05 0.01] %三个步长xleft = 1; %区域的左边界xright = 5; %区域的右边界xx = xleft:h:...

日喀则市18862322894: matlab解微分方程用欧拉法求y'= - y+x+1,y(0)=1 -
李洋刻迪:[答案] y=dsolve('Dy+y-x-1','y(0)=1','x') 结果: y = x+exp(-x)

日喀则市18862322894: Matlab问题求教~用欧拉法计算函数啊~~ -
李洋刻迪: dyfun =inline('-2*(x^3-cos(x)) +8.5');h = 1; %步长为1x = 0:h:3; y(1)=1; %初值为y(0)=1,matlab数组从1编号for n = 1:length(x)-1 y(n+1) = y(n)+h*feval(dyfun,x(n));endx %结果输出:y=y'结果如下:x = 0 1 2 3y = 1.0000 11.5000 19.0806 10.7483后面三个即为所求:11.5000 19.0806 10.7483

日喀则市18862322894: 求助过路的matlab大神,老师留作业:用两种欧拉方法解常微分方程方程是 20y"+y'+0.5y=5sin(3x) 其中 h=0.1,y'(0)=1,y"(0)= - 1 -
李洋刻迪:[答案] 欧拉方法的matlab 先定义函数euler function [x,y]=euler(fun,x0,xfinal,y0,n); if nargin

日喀则市18862322894: MATLAB 的欧拉算法怎么写 -
李洋刻迪: 式有:y(k+1)=y(k)-30*h*y(k+1) 变形求得:y(k+1)=y(k)/(30*h+1) 故MATLAB程序有:h=0.05; x=[0:h:1]; y(1)=1; for k=1:length(x)-1y(k+1)=y(k)/(30*h+1); end plot(x,y,'r.-'); title('向后欧拉'); grid on

日喀则市18862322894: 在MatLab里面用隐式欧拉法(backward euler)解决常微分方程.初学matlab 好多都不会,知道的帮下忙 -
李洋刻迪: 1.新建一个m文件,编写隐式Euler法的程序: function [x,y]=Implicit_Euler(odefun,xspan,y0,h,varargin) % 隐式Euler公式求解常微分方程 % 输入参数: % ---odefun:微分方程的函数描述 % ---xspan:求解区间[x0,xn] % ---y0:初始条件 % ---h:迭...

日喀则市18862322894: 用matlab求欧拉常数代码,谢谢各位 -
李洋刻迪: 如何用matlab求欧拉常数?1、首先我们根据欧拉常数的定义,写出其表达式,如下图所示.2、从表达式我们看到,求和部分可以用symsum函数来求解3、然后再用limit函数,求其n一﹥∞的极限4、完整的代码如下>>syms k n>>S = symsum(1/k,k,1,n) - log(n)>>vpa(limit(S,n,Inf),20)5、也可以直接用下列命令来求解>>-psi(1)6、执行结果

日喀则市18862322894: 向后欧拉的MATLAB算法 -
李洋刻迪: 由向后欧拉公式有:y(k+1)=y(k)-30*h*y(k+1) 变形求得:y(k+1)=y(k)/(30*h+1) 故MATLAB程序有:h=0.05; x=[0:h:1]; y(1)=1; for k=1:length(x)-1y(k+1)=y(k)/(30*h+1); end plot(x,y,'r.-'); title('向后欧拉'); grid on

日喀则市18862322894: matlab 欧拉方法解决查分方程程序 调用函数 -
李洋刻迪: 1、这是一个函数,必须有输入参数才能运行,你直接按F5运行肯定是不行的.2、调用方法:在命令行里运行:fun=inline('y+x','x','y')[x,y]=euler(f...

日喀则市18862322894: 用matlab求解微分方程组的数值解,原题是这样的,y'' - y - x=0,初值是y(0)=0,y'(0)=1,要求用欧拉法求解数值解 -
李洋刻迪: 可以提供两种方法:1:迭代法,通过自变量步长推进求解,有一定的算法.2:MATLAB符号运算的自带函数dsolve,可以求出解符号表达式,用自变量的域代替就行了.y=dsolve('D2y-3*Dy=x^2','Dy(0)=1','y(1)=0','x');如果要求-10到10之间的解(Y值),可令步长为0.01 x=(-10:0.01:10);y的解:y=subs(y,'x',x)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网