MATLAB常微分方程的数值解法

一、实验目的

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

二、实验原理

三、实验程序

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越大时,结果越精确。

时间: 2024-10-08 23:42:06

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

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

欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分的最基本的一类显型方法(Explicit method). [编辑] 什么是欧拉法 欧拉法是以流体质点流经流场中各空间点的运动即以流场作为描述对象研究流动的方法.--流场法 它不直接追究质点的运动过程,而是以充满运动液体质点的空间--流场为对象.研究各时刻质点在流场中的变化规律.将个别流体质点运动过

非线性方程的数值解法解释

非线性方程的数值解法通常有逐步搜索法,二分法,迭代法,牛顿法,牛顿下山法,弦截法,抛物线法... 从迭代法开始讨论 比如一个方程 f(x)=0 没有求根公式,只能用数值的方式来解决,那么就必须用迭代来求解 很多数学方面的书会告诉你上面的这些XX法怎么做,可是他们TMD就是不告诉你为什么这些迭代方式是有效的! 学了泛函我才知道原来涉及到 不动点理论,压缩映射,范数 这些东西.你们这些写书的把这些东西写在数值法解非线性方程部分的前面会死啊! 设第n步迭代结果为 xn 那么这些XX法总会构造这么个 迭

一维Burgers方程数值解法

一维Burgers方程 一维burgers方程为: 由于等式右边可以进行积分: 利用F = u**2,则方程为: 假设u初始为阶跃函数: 数值解法采用MacCormack格式: 但是这一解法,有失真的性质,后面具体介绍. 所以根据这一格式,可以直接数值求解,并利用matplotlib画出动态的数值图形,具体代码如下: # -*- coding: utf-8 -*- """ Created on Tue Jan 20 14:32:23 2015 1D burges equati

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

MATLAB常微分方程数值解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.一阶常微分方程初值问题 2.欧拉法 3.改进的欧拉法 4.四阶龙格库塔方法 5.例题 用欧拉法,改进的欧拉法及4阶经典Runge-Kutta方法在不同步长下计算初值问题.步长分别为0.2,0.4,1.0. matlab程序: function z=f(x,y) z=-y*(1+x*y); function R_K(h) %欧拉法 y=1; fprintf('欧拉法:x

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

The damped least squares method is also called the Levenberg-Marquardt method. Levenberg-Marquardt算法是最优化算法中的一种.它是使用最广泛的非线性最小二乘算法,具有梯度法和牛顿法的优点.当λ很小时,步长等于牛顿法步长,当λ很大时,步长约等于梯度下降法的步长. The damped least squares method can be theoretically justified as follo

微分方程 以及 数值解法

https://blog.csdn.net/qq_29831163/article/details/89703598 https://www.gameres.com/749181.html 原文地址:https://www.cnblogs.com/butterflybay/p/11325542.html

matlab 计算方法的总结

此文章是我的大学课程<计算方法>的总结,所选用的代码是matlab的形式,因为内容都是个人的总结,大部分都是只是一个函数+事例搞定..所以要问我基础的东西其实我也不是很懂.. 所以下面这文章不讲理论,,只讲函数怎么用..能力有限哈.. 目录 一元线性线性方程的求解 什么是一元线性方程,什么是一元非线性方程? 二分法 牛顿法 弦截法 线性方程的计算方法 相关命令的基础知识 高斯消去法 LT分解 插值法 线性插值 拉格朗日插值 牛顿插值 样条插值 其他命令 数值积分 牛顿-柯西公式 数值积分命令

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

非刚性常微分方程的数值解法通常会用四阶龙格库塔算法,其matlab函数对应ode45. 对于dy/dx = f(x,y),y(0)=y0. 其四阶龙格库塔公式如下: 对于通常计算,四阶已经够用,四阶以上函数f(x,y)计算工作量大大增加而精度提高较慢. 下面以龙格库塔法解洛伦兹方程为例: matlab代码如下: main.m: clear all; close all; clc; %系统龙格库塔法 [t,h] = ode45(@test_fun,[0 40],[12 4 0]); plot3(h

【原创】开源Math.NET基础数学类库使用(六)数值分析之线性方程直接求解

开源Math.NET基础数学类库使用系列文章总目录: 1.开源.NET基础数学计算组件Math.NET(一)综合介绍  2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算  3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式 4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式 5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式 6.开源.NET基础