matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法

这篇具有很好参考价值的文章主要介绍了matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结和记录一下matlab求解常微分方程常用的数值解法,本文先从欧拉法和改进的欧拉法讲起。

d x d t = f ( x , t ) , x ( t 0 ) = x 0 \frac{d x}{d t}=f(x, t), \quad x\left(t_{0}\right)=x_{0} dtdx=f(x,t),x(t0)=x0

1. 前向欧拉法

前向欧拉法使用了泰勒展开的第一项线性项逼近。

x ( t 0 + h ) = x ( t 0 ) + h x ′ ( t 0 ) + 1 2 x ′ ′ ( ξ ) h 2 , t 0 < ξ < t 0 + h x\left(t_{0}+h\right)=x\left(t_{0}\right)+h x^{\prime}\left(t_{0}\right)+\frac{1}{2} x^{\prime \prime}(\xi) h^{2}, \quad t_{0}<\xi<t_{0}+h x(t0+h)=x(t0)+hx(t0)+21x′′(ξ)h2,t0<ξ<t0+h

x k + 1 = x k + h x k ′ + O ( h 2 ) = x k + h f ( x k , t k ) + O ( h 2 ) x_{k+1}=x_{k}+h x'_k+O\left(h^{2}\right)=x_{k}+h f\left(x_{k}, t_{k}\right)+O\left(h^{2}\right) xk+1=xk+hxk+O(h2)=xk+hf(xk,tk)+O(h2)

2. 改进的欧拉法

在原来前向欧拉法的基础上泰勒展开使用了前面两项:
x k + 1 = x k + h x k ′ + 1 2 h 2 x k ′ ′ + O ( h 3 ) x_{k+1}=x_{k}+h x^{\prime}_k+\frac{1}{2} h^{2} x_{k}^{\prime \prime}+O\left(h^{3}\right) xk+1=xk+hxk+21h2xk′′+O(h3)

这里使用:

x k ′ ′ = x k + 1 ′ − x k ′ h x_{k}^{\prime \prime}=\frac{x_{k+1}^{\prime}-x_{k}^{\prime}}{h} xk′′=hxk+1xk

于是我们有:

x k + 1 = x k + h 2 ( x k ′ + x k + 1 ′ ) + O ( h 3 ) x_{k+1}=x_{k}+\frac{h}{2}\left(x_{k}^{\prime}+x_{k+1}^{\prime}\right)+O\left(h^{3}\right) xk+1=xk+2h(xk+xk+1)+O(h3)

也就是:

x k + 1 = x k + h 2 [ f ( x k , t k ) + f ( x k + 1 , t k + 1 ) ] + O ( h 3 ) x_{k+1}=x_{k}+\frac{h}{2}\left[f\left(x_{k}, t_{k}\right)+f\left(x_{k+1}, t_{k+1}\right)\right]+O\left(h^{3}\right) xk+1=xk+2h[f(xk,tk)+f(xk+1,tk+1)]+O(h3)

我们怎么计算 f ( x k + 1 , t k + 1 ) f(x_{k+1},t_{k+1}) f(xk+1,tk+1)呢,因为我们还不知道 x k + 1 x_{k+1} xk+1

对比前向欧拉法,改进欧拉法的右边不使用 x k + 1 x_{k+1} xk+1(我们还不知道),但是我们可以用前向欧拉法计算的 x k + h f ( x k , t k ) x_{k}+h f\left(x_{k}, t_{k}\right) xk+hf(xk,tk)来代替 x k + 1 x_{k+1} xk+1,于是我们有
x k + 1 = x k + 1 2 ( k 1 + k 2 ) + O ( h 3 ) , 其中: k 1 = h f ( x k , t k ) , k 2 = h f ( x k + h , t k + k 1 ) x_{k+1}=x_{k}+\frac{1}{2}\left(k_{1}+k_{2}\right)+O\left(h^{3}\right), \\\text{其中:}k_{1}=h f\left(x_{k}, t_{k}\right), k_{2}=h f\left(x_{k}+h, t_{k}+k_{1}\right) xk+1=xk+21(k1+k2)+O(h3),其中:k1=hf(xk,tk),k2=hf(xk+h,tk+k1)

对比一下前向欧拉法:

x k + 1 = x k + k 1 + O ( h 2 ) , k 1 = h f ( x k , t k ) x_{k+1}=x_{k}+k_{1}+O\left(h^{2}\right), \quad k_{1}=h f\left(x_{k},t_{k} \right) xk+1=xk+k1+O(h2),k1=hf(xk,tk)

例子

x ′ = x + t , x ( 0 ) = 1 x^{\prime}=x+t, \quad x(0)=1 x=x+t,x(0)=1

clc
clear

% 测试三个不同的步长
test_times = 3;
% 保存时间、差分时间和步长
h_res=ones(1,test_times);
t_res=cell(1,test_times);%时间
tplot_res=cell(1,test_times);%差分的时间,比时间长度少1
% 保存两种数值方法和解析解的计算结果
x_euler_res=cell(1,test_times);
x_modified_res=cell(1,test_times);
x_exact_res=cell(1,test_times);
% 保存误差
diff1_res=cell(1,test_times);
diff2_res=cell(1,test_times);

for i = 1:test_times
% 设置步长间隔和步长数
	h = 1/10^i; n = 10/h;
	% 设置初始条件
	t=zeros(n+1,1); t(1) = 0;
	x_euler=zeros(n+1,1); x_euler(1) = 1;
	x_modified=zeros(n+1,1); x_modified(1) = 1;
	x_exact=zeros(n+1,1); x_exact(1) = 1;
	% 设置前向欧拉法和改进欧拉法误差存放向量(和精确解比较)
	diff1 = zeros(n,1); diff2 = zeros(n,1); tplot = zeros(n,1);
	% 定义微分方程
	f = inline('xx+tt','tt','xx');
	for k = 1:n
		t(k+1) = t(k) + h;
		% 计算解析解
		x_exact(k+1) = 2*exp(t(k+1)) - t(k+1) - 1;
		% 使用前向欧拉法计算
		k1 = h * f(t(k),x_euler(k));
		x_euler(k+1) = x_euler(k) + k1;
		tplot(k) = t(k+1);
		diff1(k) = x_euler(k+1) - x_exact(k+1);
		diff1(k) = abs(diff1(k) / x_exact(k+1));
		% 使用改进欧拉法计算
		k1 = h * f(t(k),x_modified(k));
		k2 = h * f(t(k+1),x_modified(k)+k1);
		x_modified(k+1) = x_modified(k) + 0.5*(k1+k2);
		diff2(k) = x_modified(k+1) - x_exact(k+1);
		diff2(k) = abs(diff2(k) / x_exact(k+1));
	end
	diff1_res{i}=diff1;
	diff2_res{i}=diff2;
	tplot_res{i}=tplot;
	h_res(i)=h;
	x_euler_res{i}=x_euler;
	x_modified_res{i}=x_modified;
	x_exact_res{i}=x_exact;
	t_res{i}=t;
end

figure
% 不同步长下的解析解、前向欧拉法和改进欧拉法的结果
for i=1:test_times
	subplot(2,2,i)
	plot(t_res{i},x_exact_res{i},'k-',t_res{i},x_euler_res{i},'b--',t_res{i},x_modified_res{i},'r:')
	xlabel('t','Fontsize',18)
	ylabel('x','Fontsize',18)
	legend({'Analytical method','Euler method','modified Euler method'},'Location','best')
	legend boxoff;
	title(['h = ',num2str(h_res(i))]);
end

% 相对误差图
subplot(2,2,4)
for i=1:test_times
	semilogy(tplot_res{i},diff1_res{i},'b-',tplot_res{i},diff2_res{i},'r:')
	hold on
	num1 = 0.2*10/h_res(i); num2 = 0.8*10/h_res(i);
	text(3,diff1_res{i}(num1),['h = ',num2str(h_res(i))],'Fontsize',12,...
	'HorizontalAlignment','right',...
	'VerticalAlignment','bottom')
	text(9,diff2_res{i}(num2),['h = ',num2str(h_res(i))],'Fontsize',12,...
	'HorizontalAlignment','right',...
	'VerticalAlignment','bottom')
end
xlabel('t','Fontsize',18)
ylabel('|relative error|','Fontsize',18)
legend({'Euler method','modified Euler method'},'Location','best')
title('Two Euler method''s relative error')
legend boxoff;

我们对各个不同的步长进行了比较,并比较了它们的误差,发现改进的欧拉法要比前向欧拉法的精度更高。随着步长的变小,误差也在变小。

matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法,MATLAB,matlab,常微分方程,数值解,欧拉法,改进欧拉法文章来源地址https://www.toymoban.com/news/detail-642745.html

到了这里,关于matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用MATLAB求一阶微分方程(组)数值解

    标准形式要先写成左边是y的导数右边是本身函数或者自变量,然后写成.m文件类似: 如果有多个微分方程,dy=zeros(3,1);% 一定要写成列向量 3、[0,1,1]都是方程(组)的初始值,并且初始值的x=0; 就会得到一系列x,y值; ode45(最常用) **问题类型:**非刚性 **精准度:**中等 ode15s

    2024年02月11日
    浏览(34)
  • MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

    非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一

    2024年02月08日
    浏览(39)
  • 基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

    正常的求解微分方程的MATLAB格式如下: 如果需要指明自变量,则如下: 格式中的 fi 既可以描述微分方程,又可以描述 初始条件 或 边界条件 。 描述微分方程的MATLAB格式为: D4y=7 ; 描述条件的MATLAB格式为: D2y(2)=3 ; 输入信号u(t)如下: 求解如下微分方程的通解 解: 此题需

    2023年04月09日
    浏览(34)
  • 【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现

    微分方程基本概念 微分方程在数学建模中的应用 微分方程常用模型(人口增长模型、传染病模型) 2022.06.19 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中

    2024年02月09日
    浏览(53)
  • matlab解微分方程

    f=@(变量) 表达式; x1为2 3 4 5;x2为3 4 5 6的情况下求解函数f的值 用“dsolve” step1: 申明自变量和因变量 syms y(x) step2:编程 得到: step1: 申明自变量和因变量 syms y(x) step2:编程 得到 step1.写函数文件 step2.主函数 相当于定义了一个新向量y,然后列 匿名函数 ,方程的 左边都是一阶

    2024年02月13日
    浏览(36)
  • MATLAB-常微分方程求解

    MATLAB中可以用来求解常微分方程(组)的函数有ode23、 ode23s、 ode23t、 ode23tb 、ode45、ode15s和odel13等,见下表。它们的具体调用方法类似,为了方便后面的描述, 在后面的介绍中将使用solver统一代替它们。 函数的具体调用方法如下。 [T,Y] =solver( odefun, tspan,y0) [T,Y] = solver( odefun,

    2024年02月02日
    浏览(35)
  • matlab解微分方程:方向场

    在微分方程中,常见的形式是: x ′ = f ( x , t ) x\\\'=f(x,t) x ′ = f ( x , t ) 方向场的每一个矢量可以形象地刻画一阶微分方程的解。在方向场中的每个点处,都会出现一条其斜率等于通过该点的微分方程解的矢量。给定一个初值,微分方程对应一条curve曲线,点上的方向矢量和相

    2024年02月13日
    浏览(23)
  • matlab使用教程(29)—微分方程实例

            此示例说明如何使用 MATLAB® 构造几种不同类型的微分方程并求解。MATLAB 提供了多种数值算法来求解各种微分方程:         vanderpoldemo 是用于定义 van der Pol 方程的函数 function dydt = vanderpoldemo(t,y,Mu) %VANDERPOLDEMO Defines the van der Pol equation for ODEDEMO. % Copyright 1984-2

    2024年02月10日
    浏览(25)
  • Matlab偏微分方程拟合 | 完整源码 | 视频教程

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏:《 复杂函数拟合案例分享 》本专栏旨在提供 1.以 案例 的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例 完整源码 ;2. 复杂函数 包含:分段函数、积分函数、常/偏微分函数、隐

    2024年04月10日
    浏览(69)
  • matlab求解时变系统的Riccati矩阵微分方程

    对于代数Riccati方程的求解网上能找到很多的资源,matlab也有成熟的函数,但是对于时变系统的Riccati矩阵微分方程,能找到的资料还比较少。 可以在网上找到很多资料,如 https://blog.csdn.net/m0_62299908/article/details/127807014 matlab也有相应的一系列函数 lqr、icare等。 对于这些函数不

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包