失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > matlab分别用欧拉法 改进欧拉法 和四阶龙格法对同一个函数进行拟合

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

时间:2022-04-28 11:20:43

相关推荐

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 : nx(i + 1) = x(i) + h;y(i + 1) = y(i) + h * (2 * y(i) / (x(i)+1));end%命令1x0 = 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)%画出图像,红色,线的宽度为2l = 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+1x(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 : nx(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%命令2x0 = 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 onplot(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:nx(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;endend%命令3x0 = 0;x1 = 1;y0 = 1;h = 0.1;[x, y] = runge(x0, x1, y0, h);yy = (1+x).*(1+x); %精确解hold onplot(x, yy, 'r');plot(x, y, 'b.');%由于四阶龙格法与理论值的贴合度太高,所以一个采用了线段形式,一个采用了点的形式%其中点为四阶龙格,线是标准值

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

如果觉得《matlab分别用欧拉法 改进欧拉法 和四阶龙格法对同一个函数进行拟合》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。