MATLAB常微分方程的数值解法

作者:凯鲁嘎吉 - 博客园
http://www.cnblogs.com/kailugaji/

一、实验目的

科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是求未知函数在一系列离散点处的近似值。

二、实验原理

三、实验程序

1. 尤拉公式程序

四、实验内容

选一可求解的常微分方程的定解问题,分别用以上1, 4两种方法求出未知函数在

节点处的近似值,并对所求结果与分析解的(数值或图形)结果进行比较。

五、解答

1. 程序

求解初值问题

取n=10

源程序:

euler23.m:

function [A1,A2,B1,B2,C1,C2]=euler23(a,b,n,y0)
%欧拉法解一阶常微分方程
%初始条件y0
h = (b-a)/n; %步长h
%区域的左边界a
%区域的右边界b
x = a:h:b;
m=length(x); %前向欧拉法
y = y0;
for i=2:m
y(i)=y(i-1)+h*oula(x(i-1),y(i-1));
A1(i)=x(i);
A2(i)=y(i);
end
plot(x,y,'r-');
hold on; %改进欧拉法
y = y0;
for i=2:m
y(i)=y(i-1)+h/2*( oula(x(i-1),y(i-1))+oula(x(i),y(i-1))+h*(oula(x(i-1),x(i-1))));
B1(i)=x(i);
B2(i)=y(i);
end
plot(x,y,'m-');
hold on; %欧拉两步公式
y=y0;
y(2)=y(1)+h*oula(x(1),y(1));
for i=2:m-1
y(i+1)=y(i-1)+2*h*oula(x(i),y(i));
C1(i)=x(i);
C2(i)=y(i);
end
plot(x,y,'b-');
hold on; %精确解用作图
xx = x;
f = dsolve('Dy=-3*y+8*x-7','y(0)=1','x');%求出解析解
y = subs(f,xx); %将xx代入解析解,得到解析解对应的数值 plot(xx,y,'k--');
legend('前向欧拉法','改进欧拉法','欧拉两步法','解析解'); oula.m:
function f=oula(x,y)
f=-3*y+8*x-7;

  

2. 运算结果

A1,A2为前向欧拉法在节点处的近似值,B1,B2为改进的欧拉法在节点处的近似值,C1,C2为欧拉公式法在节点处的近似值。

>> [A1,A2,B1,B2,C1,C2]=euler23(0,1,10,1)

A1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

A2 =

         0         0   -0.6200   -0.9740   -1.1418   -1.1793   -1.1255   -1.0078   -0.8455   -0.6518   -0.4363

B1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

B2 =

         0    0.0050   -0.6090   -0.9563   -1.1169   -1.1468   -1.0853   -0.9597   -0.7893   -0.5875   -0.3638

C1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000

C2 =

         0         0   -0.2400   -0.9360   -0.5984   -1.3370   -0.3962   -1.5392    0.2473   -1.8076

>> [A1,A2,B1,B2,C1,C2]=euler23(0,1,10,1)

A1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

A2 =

         0         0   -0.6200   -0.9740   -1.1418   -1.1793   -1.1255   -1.0078   -0.8455   -0.6518   -0.4363

B1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

B2 =

         0    0.0050   -0.6090   -0.9563   -1.1169   -1.1468   -1.0853   -0.9597   -0.7893   -0.5875   -0.3638

C1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000

C2 =

         0         0   -0.2400   -0.9360   -0.5984   -1.3370   -0.3962   -1.5392    0.2473   -1.8076

  

3. 拓展(方法改进、体会等)

从以上图形可以看出,在n=10时,改进的欧拉法精度更高,而欧拉两步法所求结果震荡不收敛,越接近1,震荡幅度越大,于是取n=100,时,结果如下所示:

当n=1000时,结果如下图:

当n=100时,三种方法与解析解非常接近,当n=1000时,几乎四者位于一条线中,从实验结果看出,n越大时,结果越精确。

MATLAB常微分方程的数值解法的更多相关文章

  1. Euler-Maruyama discretization("欧拉-丸山"数值解法)

    欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分 ...

  2. V-rep学习笔记:机器人逆运动学数值解法(The Jacobian Transpose Method)

    机器人运动学逆解的问题经常出现在动画仿真和工业机器人的轨迹规划中:We want to know how the upper joints of the hierarchy would rotate ...

  3. MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法

    MATLAB常微分方程数值解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.一阶常微分方程初值问题 2.欧拉法 3.改进的欧拉法 4.四阶龙格库塔 ...

  4. 偏微分方程数值解法的MATLAB源码

    原文出处http://wenku.baidu.com/view/df412e115f0e7cd184253653.html 因为不太喜欢百度文库的格式,所以写到个人博客里面方便使用 <ifram ...

  5. Matlab-7:偏微分方程数值解法-李荣华-有限元解导数边界值的常微分(Galerkin方法)

    p47.(实习题-李荣华)用线性元求下列边值问题的数值解 tic; % this method is transform from Galerkin method %also call it as f ...

  6. V-rep学习笔记:机器人逆运动学数值解法(Cyclic Coordinate Descent Method)

    When performing inverse kinematics (IK) on a complicated bone chain, it can become too complex for a ...

  7. V-rep学习笔记:机器人逆运动学数值解法(Damped Least Squares / Levenberg-Marquardt Method)

    The damped least squares method is also called the Levenberg-Marquardt method. Levenberg-Marquardt算法 ...

  8. V-rep学习笔记:机器人逆运动学数值解法(The Pseudo Inverse Method)

    There are two ways of using the Jacobian matrix to solve kinematics. One is to use the transpose of ...

  9. matlab练习程序(龙格库塔法)

    非刚性常微分方程的数值解法通常会用四阶龙格库塔算法,其matlab函数对应ode45. 对于dy/dx = f(x,y),y(0)=y0. 其四阶龙格库塔公式如下: 对于通常计算,四阶已经够用,四阶以 ...

随机推荐

  1. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  2. 光流法详解之二(HS光流)

    Horn–Schunck光流算法[1]是一种全局方法估算光流场. 参考博文:https://blog.csdn.net/hhyh612/article/details/79216021 假设条件: H ...

  3. Hyperledger Fabric密码模块系列之BCCSP(四)

    前面说过要找时间介绍一下bccsp包下面的工厂factory,so here it is. 通过factory目前可以获得两类BCCSP实例,一个是上文说的sw,还有一个是通过pkcs11实现的. B ...

  4. MySQL基准测试(三)--开源工具与实例演示

    MySQL基准测试(三)--开源工具与实例演示 针对web应用 ab ab是一个Apache HTTP服务的基准测试工具. http_load http_load是一个针对Web服务器测试工具. JM ...

  5. SQL不重复查找数据及把一列多行内容拼成一行

    如下表: 表名:Test ID RowID Col1 Col2 1 1 A A 2 1 B A 3 1 A B 4 1 C B 1,查找表中字段重复的只查找一次 select distinct Col ...

  6. WebFrom 【文件上传】

    文件上传 准备工作1.文件上传的页面2.上传文件要保存的文件夹 1.只要将文件传上来就行 //1.获取要上传的文件,并且知道要上传到服务器的路径 string s = "Uploads/aa ...

  7. [PHP]算法-归并排序的PHP实现

    <?php //归并排序 function merge(&$A,$left,$mid,$right,$temp){ //7.左堆起始 $i=$left; //8.右堆起始 $j=$mid ...

  8. 【原】Spring AOP实现对Redis的缓存同步

    前言:刚开始采用spring cache作为缓存数据,到后面发现扩展性不灵活,于是基于sprig cache原理自定义一套规则用于缓存数据. 请求过程: 根据请求参数生成Key,后面我们会对生成Key ...

  9. Perfect hashing (And Minimal perfect hashing)

    Perfect Hashing: A hash function that is injective-that is, maps each valid input to a different has ...

  10. hash table (youtube 2)

    https://www.youtube.com/watch?v=jEdaduyLLqY