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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab编程问题利用欧拉方法求常微分方程近似数值解相关的知识,希望对你有一定的参考价值。

取h=0.1,0.05,0.01,用欧拉显式方法求解一阶线性微分方程:
计算到y

(2)并于精确解比较

。求本题完整matlab程序。

%欧拉法解一阶常微分方程
% 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;

追问

第三行是不是遗漏了什么啊 我在matlab上运行它说不正确啊

追答

什么错误?

追问

可能是我command语句输错了 你在command窗口输入的啥子嘛

参考技术A

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('解曲线','精确解')

[数学]Euler‘s Method 欧拉方法

1-思想原理

求解一阶的常微分方程ODE,欧拉想出一种数值方法,得到一种线性近似Linear approximation
他并非求解出具体的y的方程,而是根据给定的初始值((x_0,y_0=f(x_0))求得下个想要求得的点(x_n)的函数值(y_n=f(x_0)),当然这样就得到了想要的点的坐标((x_n,y_n=f(x_n))
那么他是怎么做的呢?
欧拉是利用倒数的几何意义即斜率来求得下个点的坐标值
欧拉说 下个点的函数值近似等于 [y_n = y_0 + frac{dy}{dx}|_{x=x_0} * (x_n-x_0)]
欧拉是借鉴了 这样的一个事实: [frac{y_1-y_0}{x_1-x_0}=tanalpha]
欧拉说如果(h=x_1-x_0)足够小,那么就结果值越精确

2-案例

下图是一个example,初始值为(0,2),求得在区间[0,1]上的函数值,分成等长的四段,每段长0.25,这里就体现了线性近似(看结果图)

技术图片

对比图

技术图片

MATLAB 代码

fun = @(x,y) (x+y);
% 欧拉近似值
re = euler_method(fun,0,2,1,0.25);
fprintf('result is %f
',re);

% 准确值
xx = 0:0.25:1;
yy = 3*exp(xx)-xx-1;
p1=plot(xx,yy,'b');

legend('Euler','Point','Exact');

% Euler Method
% f 表示一阶常微分方程
% (x0,y0):初始值
% xn要求的函数值的自变量的值
% h 步长
function y = euler_method(f,x0,y0,xn,h)
    n = round((xn-x0)/h);
    y = y0;
    x = x0;
    xa = [];
    xa(1) =x0;
    re = [];
    re(1) = y;
    
    for i=1:n
        y = y + h*f(x,y);
        x = x + h;
        % 保存段点值,用于绘图
        xa(i+1)=x;
        re(i+1)=y;
    end  
    p2=plot(xa,re,'r');
    legend(p2,'ds');
    hold on;%不清除画面
    p3=scatter(xa,re,'*');% 描点
    legend(p3,'ds');
end

Result:

技术图片

技术图片

以上是关于matlab编程问题利用欧拉方法求常微分方程近似数值解的主要内容,如果未能解决你的问题,请参考以下文章

matlab用龙格库塔法求解变系数常微分方程

如何用matlab求解常微分方程?matlab解常微分方程之符号解法介绍

MATLAB解常微分方程的数值解

如何用matlab求解微分方程组的数值解

MATLAB常微分方程数值解——欧拉法改进的欧拉法与四阶龙格库塔方法

求编程达人帮忙用matlab编程用龙格库塔方法解微分方程