matlab分别用欧拉法,改进欧拉法,和四阶龙格法对同一个函数进行拟合

这篇具有很好参考价值的文章主要介绍了matlab分别用欧拉法,改进欧拉法,和四阶龙格法对同一个函数进行拟合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于数值分析临时布置了有关于MATLAB一个大作业,才发现身边有相当一部分的同学对matlab相当不熟悉,于是做了一个关于这三个方法的小文章做一点抛砖引玉的作用。

首先是关于这三个方法的总结,欧拉法属于显式的算法,即可以直接由已知的数据推出所需要的数据,但是贴合的程度较低。改进欧拉法增加了一步计算量,使曲线能够更加的贴近于原数据,而四阶龙格法则是贴合程度最高,但相对计算量最大的一个算法。

各个算法的公式如下:

一阶微分方程:

改进欧拉法matlab编程,matlab,算法

 欧拉法:

改进欧拉法matlab编程,matlab,算法

 文章来源地址https://www.toymoban.com/news/detail-778705.html

改进欧拉法:

改进欧拉法matlab编程,matlab,算法

四阶龙格法:

改进欧拉法matlab编程,matlab,算法 

 

 

下面直接上MATLAB代码来实现操作,具体操作的步骤和原因看代码的注释,

%func1.m文件  常微分方程为y' = 2*y/(x+1)
function z = func1(x, y)  
z = 2*y/(x+1);   %欧拉法函数定义


%forwardEuler1.m文件 向前欧拉法
function [x, y] = forwardEuler(x0, y0, x1, h)  %定义函数
n = floor((x1 - x0)/h);   %得到所要建立的向量长度
x = zeros(n + 1, 1);      %建立x和y的向量
y = zeros(n + 1, 1);
x(1) = x0;    %赋值:由于matlab是从1开始而不是从0开始
y(1) = y0;
% 带入公式,用for循环得出向量各个值
for i = 1 : n
    x(i + 1) = x(i) + h;
    y(i + 1) = y(i) + h * (2 * y(i) / (x(i)+1));
end


%命令1
x0 = 0;                                          %x起始值
x1 = 1;                                         %x终止值
h = 0.1;                                         %步长
y0 = 1;                                          %y起始值
[x, y] = forwardEuler(x0, y0, x1, h);            %函数代入
hold on                                          %将多个图均显示出来
plot(x, y,'r','LineWidth', 2)                    %画出图像,红色,线的宽度为2
l = x0 : 0.1 : x1;                               %取标准值
lu = (x+1).*(x+1);
plot(l, lu, 'g','LineWidth', 2)
legend('欧拉方法','理论值')


%func2.m文件  常微分方程为y' = 2*y/(x+1)
function z = func2(x, y)  
z = 2*y/(x+1);   %改进欧拉法函数定义


%Euler2.m文件 未改进的欧拉法
function [x, y] = Euler(x0, x1,  y0, h)
n = floor((x1 - x0)/h);    % 求n值
x = zeros(n + 1, 1);       % 定义x与y向量
y = zeros(n + 1, 1);
x(1, 1) = x0;
y(1, 1) = y0;
for i = 2 : n+1
    x(i, 1) = x(i - 1, 1) + h;
    y(i, 1) = y(i - 1, 1) + h * (2 * y(i - 1, 1)  / (x(i - 1, 1) + 1));
end


%improvedEuler2.m文件 改进后的欧拉法
function [x, y] = improvedEuler(x0, x1, y0, h)
n = floor((x1 - x0)/h);
x = zeros(n + 1, 1);
y = zeros(n + 1, 1);
x(1) = x0;
y(1) = y0;
% 改进欧拉法公式代入,由于有不同的公式则先得出z1,才能进行z2的运算
for i = 1 : n
    x(i + 1) = x(i) + h;
    z1 = 2 * y(i) / (x(i)+1);
    z2 =  2 * (y(i) + h * z1) / (x(i) + h + 1);
    y(i + 1) = y(i) + h / 2 * (z1 + z2);
end



%命令2
x0 = 0;
x1 = 1;
y0 = 1;
h = 0.1;
[x, y] = useEuler(x0, x1, y0, h);
yy = (1+x).*(1+x);    %精确解
[x, q] = improvedEuler(x0, x1, y0, h);
hold on
plot(x, y, 'k');
plot(x, yy, 'r');
plot(x, q, 'b');
legend('传统欧拉法','理论值','改进欧拉法')





%func3.m文件  常微分方程为y' = 2*y/(x+1)
function z = func3(x, y)  
z = 2*y/(x+1);   %四阶龙格法函数定义


%runge3.m文件 四阶龙格法方法展示
function [x, y] = runge(x0, x1, y0, h)
n = (x1 - x0) / h;
x = zeros(n + 1);
y = zeros(n + 1);
x(1) = x0;
y(1) = y0;
%按照四阶龙格公式得出下列式子
for i = 1:n
    x(i + 1) = x(i) + h;
    k1 = func(x(i), y(i));
    k2 = func(x(i) + 0.5*h, y(i) + k1*h/2);
    k3 = func(x(i) + 0.5*h, y(i) + k2*h/2);
    k4 = func(x(i)+ h, y(i) + k3*h);
    y(i + 1) = y(i) + h*(k1 + 2*k2 + 2*k3 + k4)/6;
end
end



%命令3
x0 = 0;
x1 = 1;
y0 = 1;
h = 0.1;
[x, y] = runge(x0, x1, y0, h);
yy = (1+x).*(1+x);    %精确解
hold on
plot(x, yy, 'r');
plot(x, y, 'b.');

%由于四阶龙格法与理论值的贴合度太高,所以一个采用了线段形式,一个采用了点的形式
%其中点为四阶龙格,线是标准值

其中根据1.2.3分别进行不同的分文件选取,即后缀含有1的代表欧拉法展示,后缀含有2的代表改进欧拉法的展示,后缀带3的代表四阶龙格法展示,大概会产生十个分文件,分别在命令的文件中进行运行即可得到所需的下列三个图像。

 改进欧拉法matlab编程,matlab,算法

 改进欧拉法matlab编程,matlab,算法

 改进欧拉法matlab编程,matlab,算法

 

到了这里,关于matlab分别用欧拉法,改进欧拉法,和四阶龙格法对同一个函数进行拟合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 欧拉法与梯形法求解微分方程【含matlab源代码】

    本文介绍两种入门级求解微分方程的方法 —— 梯形法与欧拉法。 将上述方程组改写成matlab语言: 一、欧拉法 1.1 向前欧拉公式 1.2 向后欧拉公式     欧拉法求解源代码       欧拉法结果图   二、梯形法    梯形法求解源代码       梯形法结果图    感谢 Miracle 向公众

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

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

    2023年04月09日
    浏览(47)
  • 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

    旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,通过三者之间的转换可以减小一些算法的复杂度。 本文主要概述旋转矩阵、欧拉角、四元数的基本理论、三者之间的转换关系以及三者转换在eigen、matlab和pathon上的方法实现。 对于两个三维点 p1 、 p2 : p 1 ( x

    2023年04月11日
    浏览(47)
  • 【数理知识】三维空间旋转矩阵的欧拉角表示法,四元数表示法,两者之间的转换,Matlab 代码实现

    序号 内容 1 【数理知识】自由度 degree of freedom 及自由度的计算方法 2 【数理知识】刚体 rigid body 及刚体的运动 3 【数理知识】刚体基本运动,平动,转动 4 【数理知识】向量数乘,内积,外积,matlab代码实现 5 【数理知识】最小二乘法,从线性回归出发,数值举例并用最小

    2024年02月12日
    浏览(51)
  • 欧拉角计算旋转矩阵的MATLAB函数——eul2rotm和angle2dcm区别

    学惯导的人都知道怎么根据欧拉角或者姿态角计算旋转矩阵,直接照着公式两分钟就写好了代码。但是或许你没有注意到MATLAB中 eul2rotm 和 angle2dcm 两个函数的定义完全不一样, 两个函数算出来的旋转矩阵互为转置 。MATLAB本身并未将两个函数的定义写得很清楚,经过一番搜索

    2024年02月15日
    浏览(46)
  • 【群智能算法改进】一种改进的白鲸优化算法 改进白鲸优化算法 改进后的EBWO[1]算法【Matlab代码#40】

    白鲸优化算法 (BWO,beluga whale optimization) 是2022 年在白鲸游泳、捕鲸及跌倒等行为中得到启发而提出的一种新型基于种群的元启发式算法。BWO 主要对白鲸游泳、捕食及跌倒 (坠落) 等行为进行模拟,其对应探索、开发及鲸鱼坠落三个阶段。BWO 当中鲸落概率与平衡因子均为自适应

    2024年02月09日
    浏览(46)
  • 【群智能算法改进】一种改进的白鲸优化算法 改进白鲸优化算法 改进后的EBWO[2]算法【Matlab代码#42】

    白鲸优化算法 (BWO,beluga whale optimization) 是2022 年在白鲸游泳、捕鲸及跌倒等行为中得到启发而提出的一种新型基于种群的元启发式算法。BWO 主要对白鲸游泳、捕食及跌倒 (坠落) 等行为进行模拟,其对应探索、开发及鲸鱼坠落三个阶段。BWO 当中鲸落概率与平衡因子均为自适应

    2024年02月12日
    浏览(37)
  • C语言实现矩阵求逆(四阶)

    伴随矩阵和代数余子式法 高斯消元法 LU分解 前言: 本文讲述伴随矩阵求逆,其余方法有时间会加以整理。 参考: 代码实现矩阵求逆的三种方式 矩阵的行列式

    2024年02月08日
    浏览(44)
  • Python 全栈体系【四阶】(二十五)

    11. 图像梯度处理 11.1 什么是图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。一般情况下,图像梯度计算的是图像的边缘信息。 11.2 模板运

    2024年04月10日
    浏览(35)
  • 四阶巴特沃斯高通滤波器

    图1.1-1 巴特沃斯高通滤波器归一化幅频响应 图1.1-2 巴特沃斯低通、高通电路阶数n与增益的关系 图1.1-3 二阶高通滤波电路及其传递函数 综合滤波器滤波效果及电路实现难度,采用四阶高通滤波器 图1.2-1 四阶高通滤波电路 查表得到,四阶巴特沃斯的一级电路的放大系数为1.1

    2024年02月06日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包