常微分方程求解在MATLAB,MatLab常微分方程及常微分方程组的求解

最近参加了数学建模,对于老师说的Euler算法的不同步长的精度不一样,编写了一个M函数文件来实现这个精度的比较,把函数附上:

function [x,y]= Euler(varargin)

%这里使用可变输出输入函数的

%varargin{1}为求解常微分方程的表达式

%varargin{2}为求解常微分方程的定解条件

%需要给出的变量有常微分方程的范围a,b(varargin{3},varargin{4})

%n为对这个区间的分割(varargin{5})

%xlt写于7月8日

%取得算法需要的变量,并附上容易理解的含义变量

a = varargin{3};

b = varargin{4};%自变量的范围

n = varargin{5};%区间的分割次数

h = (b - a)/n;%步长

Dy = varargin{1}; %常微分方程的表达式

y0 = varargin{2}; %常微分方程的定解条件表达式

%首先求出所给常微分方程问题的精确解

x1 = zeros(n+1,1);

y1 = zeros(n+1,1);

syms f1; syms x;

f1 = dsolve(Dy,y0,'x');

x1(1) = a;

y1(1) = subs(f1,{x},{x1(1)});

for i = 2:(n+1)

x1(i) =

x1(i-1) + h;

y1(i) =

double(subs(f1,{x},{x1(i)}));

end

%利用Euler方法求解近似数值微分解

x2 = zeros(n+1,1);

y2 = zeros(n+1,1);

syms y;

x2(1) = a;

y2(1) = subs(f1,{x},{a});%获得原方程的初解

for i = 2:(n+1)

x2(i) =

x2(i-1) + h;

y2(i) =

y2(i-1) + h .*

double(subs(Dy(5:end),{x,y},{x2(i-1),y2(i-1)}));%特别记录Matlab中的字符串操作,提取子字符串即A(3:6)...

end

%返回经过Euler算法算出x与y的值

x = x2;

y = y2;

%画图进行误差比较

plot(x1,y1,'r');

hold on;

plot(x2,y2,'b');

特此记录,以后写了新的算法再分享

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值