龙空技术网

MATLAB实例讲解欧拉法求解微分方程

云龙派 5129

前言:

现在看官们对“c语言欧拉法求解常微分方程代码”大体比较关心,小伙伴们都需要知道一些“c语言欧拉法求解常微分方程代码”的相关内容。那么小编也在网上搜集了一些关于“c语言欧拉法求解常微分方程代码””的相关内容,希望大家能喜欢,兄弟们一起来了解一下吧!

摘要:讲解欧拉法求解微分方程原理,通过MATLAB程序求解实例。

求解微分方程的时候,如果不能将求出结果的表达式,则可以对利用数值积分对微分方程求解,获取数值解。欧拉方法是最简单的一种数值解法。本文理论部分来自知乎作者云端之下的文章“常微分方程——数值解——欧拉方法”,文章链接为:

实例

求解微分方程dy/dt=-y+t+1,y(0)=1,t的取值为0到2,步长h=0.1,用欧拉法求解微分方程并将结果与y(t)=exp(-t)+t比较。

主程序

clc;clear all;close all;h = 0.1;%步长y0 = 1;%初值t = 0:h:2;%x范围y = exp(-t)+t;%真解n = length(t);numy = zeros(1,n);f2 = -y0;numy(1) = y0;%欧拉法计算for i=2:n    numy(i) = euler1(y0,h,f2);    y0 = numy(i);    f2 = f1(t(i),y0);end%绘图figure;plot(t,y,'r-','linewidth',1);hold on;plot(t,numy,'b-','linewidth',1);xlabel('t');grid on;title('Euler法求系统的输出响应');ylabel('输出响应y(t)');legend('真解','Euler法','location','northwest');wucha_euler = (numy-y).^2;disp('Euler法误差平方:');wucha_euler

自定义函数euler1.m

function y = euler1(y0,h,f2)%%输入参数 y0表示 t=0时 y的取值  即初值%h表示步长 %f 表示函数值%输出y表示方程的响应yy=y0+h*f2;end

自定义函数f1.m

function f= f1(x,y)f = -y+x+1;%微分方程 dy/dt=-y+t+1  初值y(0)=1  微分方程右边的剩余部分构成的函数end

运行结果

Euler法误差平方:wucha_euler =  列 1 至 12         0    0.0110    0.0097    0.0086    0.0076    0.0067    0.0058    0.0051    0.0044    0.0039    0.0034    0.0029  列 13 至 21    0.0025    0.0022    0.0019    0.0016    0.0014    0.0012    0.0010    0.0009    0.0007

改进程序:修改步长h,h分别取值0.1 0.05 0.01 0.001,取值t为0到1,对比结果。

主程序

clc;clear all;close all;h = [0.1 0.05 0.01 0.001];%步长for j = 1:length(h)    y0 = 1;%初值    t = 0:h(j):1;%x范围    y = exp(-t)+t;%真解    n = length(t);    numy = zeros(1,n);    f2 = -y0;    numy(1) = y0;    %欧拉法计算    for i=2:n        numy(i) = euler1(y0,h(j),f2);        y0 = numy(i);        f2 = f1(t(i),y0);    end    %每次因为步长不一样 所以不能用矩阵存结果     s{j,:} = numy;%引入元胞类型 Cell 能包含任何类型的数据,比如数值、字符串、逻辑值甚至是Cell自身。    T{j,:}=t;end%绘图figure;plot(t,y,'r-','linewidth',1);hold on;plot(T{1,:},s{1,:},'b-','linewidth',1);plot(T{2,:},s{2,:},'g-','linewidth',1);plot(T{3,:},s{3,:},'k-','linewidth',1);plot(T{4,:},s{4,:},'m-','linewidth',1);xlabel('t');grid on;title('Euler法求系统的输出响应');ylabel('输出响应y(t)');legend('真解','Euler法 h=0.1','Euler法 h=0.05','Euler法 h=0.0.01','Euler法 h=0.001','location','northwest');

自定义函数f1.m

function f= f1(x,y)f = -y+x+1;%微分方程 dy/dt=-y+t+1  初值y(0)=1  微分方程右边的剩余部分构成的函数end

自定义函数euler1.m

function y = euler1(y0,h,f2)%%输入参数 y0表示 t=0时 y的取值  即初值%h表示步长 %f 表示函数值%输出y表示方程的响应yy=y0+h*f2;end

运行结果

作 者 | 郭志龙

编 辑 | 郭志龙

校 对 | 郭志龙

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

标签: #c语言欧拉法求解常微分方程代码 #欧拉方法解微分方程编程 #欧拉法应用实例 #欧拉法应用实例分析 #欧拉公式解微分方程