求解高阶微分方程

目录

  • ODE45 求解高阶微分方程

    • ode45是什么
    • ode45能干什么
    • ode45怎么用
      • 语法
      • 高阶 ODE通用解法
      • Demo1
      • 问题来了
    • 结果图展示

ODE45 求解高阶微分方程

最近困惑我一周的高阶微分方程求解,特地来总结一下,给有需要的同志们!

(特此说明,官网有纰漏, 存在问题, 需要修改, 我最后会说哪里出问题了)

ode45是什么

? 所有 MATLAB ODE 求解器都可以解算 y′=f(t,y) 形式的方程组,或涉及质量矩阵 M(t,y)y′=f(t,y) 的问题。求解器都使用类似的语法。ode45 是一个通用型 ODE 求解器,是您解算大多数问题时的首选。但是,对于刚性问题或需要较高准确性的问题,其他 ODE 求解器可能更适合。

ode45能干什么

? 求解几乎能遇到的大多数微分方程, 一阶,二阶,三阶甚至多阶微分方程

ode45怎么用

语法

[t,y] = ode45(odefun,tspan,y0)
[t,y] = ode45(odefun,tspan,y0,options)
[t,y,te,ye,ie] = ode45(odefun,tspan,y0,options)

只知道语法远远不够, 因为里面各个项都不知道是什么,先简要介绍,下面给个demo:

odefun就是使用代换法,将你高阶方程转化为一阶方程对应的函数;
tspan就是微分的解范围, 尽量缩小, 不然电脑要爆炸;

y0是你能计算的方程解;

高阶 ODE通用解法

MATLAB ODE 求解器仅可解算一阶方程。您必须使用常规代换法,将高阶 ODE 重写为等效的一阶方程组

y1=y

y2=y

y3=y′′?

这些代换将生成一个包含 n 个一阶方程的方程组

y′1=y2

y′2=y3??????????

y′n=f(t,y1,y2,...,y**n*).

Demo1

考虑三阶 ODE

y′′′?y′′y+1=0.

使用代换法

y1=y

y2=y

y3=y′′

生成等效的一阶方程组

y′1=y2y′2=y3y′3=y1?y*3?1.

此方程组的代码则为

function dydt = f(t,y)
dydt(1) = y(2);
dydt(2) = y(3);
dydt(3) = y(1)*y(3)-1;

问题来了

上面demo这样定义函数不能用; 正确做法你得先定义向量解, 毕竟高阶方程化为一阶以后, 解应该是以向量的形式出现的; 所以, 这一步非常关键;

则以上方程组代码应该修改为:

function dydt = f(t,y)
dy = zeros(3,1);  %记住这里要添加哦;
dydt(1) = y(2);
dydt(2) = y(3);
dydt(3) = y(1)*y(3)-1;

行吧, 其余的计算可以去参考官网了, 可以很方便的获得方程的各个解哦;

matlab真的是除了不能生孩子,啥都能干;

ps: 吐槽一点,matlab太费电了。mac满电正常续航六个小时以上,跑matlab这个程序半个多小时就会没电, 所以大家还是连接电源再去跑matlab;

结果图展示

原文地址:https://www.cnblogs.com/liguo-wang/p/12431557.html

时间: 2024-10-09 00:15:37

求解高阶微分方程的相关文章

使用numpy求解Zoepritz 方程矩阵伪逆时报错: SVD did not converge

笔者在使用numpy中的pinv函数求解伪逆时系统报错: SVD did not converge. 奇异值分解不收敛 具体原因不太清楚, 应该是因为函数在求解伪逆的算法在迭代过程中难以收敛导致的. 解决方法: 引入scipy中的求解伪逆的函数 scipy.linalg.pinv Zoepritz equations的python程序在: https://github.com/cui-xiaoang96/Zoepritz-equations 原文地址:https://www.cnblogs.co

用弦截法求解方程的根

//弦截法求解方程的根 //要求:输入左右两个端点x值 //结果:在一定精度范围内求解出方程的根 //难点:1)推导出x处的横坐标的求解公式 2)迭代掉原来的左端点或者右端点 #include "pch.h" #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x); double xpoint(double x1,

全局照明算法基础(一)——从辐射亮度到渲染方程

全局照明(Global Illumination)问题上已经有很多著名的算法,如路径追踪(Path Tracing),辐照度(Radiosity)等.绝大部分书籍/教材都直接介绍了做法,在理论方面有所欠缺(比如算法的正确性).这段时间在看<Advanced Global Illumination>,大呼爽快,所以做了这些笔记. 一.方向和立体角 立体角(Solid Angle)是平面角的推广.如上图,考虑一块不规则的曲面,其在单位球体(球心在原点,半径)上的投影为曲面,则的面积为该曲面对应的立

【原创】开源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基础

遗传算法的简单应用-巡回旅行商(TSP)问题的求解

上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次的TSP问题的题目是: 随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径 ========================================================== 下面就是具体的求解,由于我的策略是基于知网上的<一种改进的遗

算法总结之求解模线性方程组

1)求解模线性方程 ax = b(mod n) 方程ax = b(mod n) -> ax = b + ny ->ax - ny = b -> ax + n (-y) =b 其中a,n,b已知. 可用扩展欧几里得来求解该方程的一组特解. 这里给出下列几个定理用来求解方程: 1.当且仅当d|b时,方程ax = b(mod n)有解.d=gcd(a,n) 2.ax = b(mod n) 或者有d个不同解,或者无解. 3.令d=gcd(a,n) 假定对整数x', y', 有d = ax' +

求解PDE的多重网格法(MG)

多重网格法相对于普通的Jacobi迭代或者G-S迭代等能够得到和未知数的个数成线性的高效运行时间的主要原因在于:迭代初值的一步步接近真值和G_S方法的前面几步的快速收敛性. 先看一张图[1]: 这张图说明了以下几点:一.G-S迭代法在开始几步迭代时收敛速度很快,但是随着步数的增加收敛速度逐渐减慢:二.第一条性质和求解的方程未知数的个数无关,尤其是在最开始的收敛速度很快的几步:三.未知数个数越少,最终收敛速度越快,如图中的绿线(这个可以从另一个角度来理解,一般情况下,求解未知数个数少的方程显然比求

开源Math.NET基础数学类库使用(06)数值分析之线性方程组直接求解

原文:[原创]开源Math.NET基础数学类库使用(06)数值分析之线性方程组直接求解 开源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基

用R语言求解非线性方程

从本质上来说,Newtons就是用迭代方式,使近似解(泰勒公式)不断的逼近真实解,当满足精度要求时,即可认为近似解为真实解 下面用R语言实现Newtons法 Newtons<-function(fun,x,ep=1e-5,it_max=100) ##fun为需要求解的方程(组),x为初始解,ep为精度要求,it_max为最大迭代次数{ index<-0 ##指示是否完成迭代成功,满足精度要求 k<-1 ##迭代次数 while(k<=it_max) { x1<-x;obj&l