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=%f, y=%f\n‘,0,1);
for i=1:1/h
    x=(i-1)*h;
    K=f(x,y);
    y=y+h*K;
    fprintf(‘欧拉法:x=%f, y=%f\n‘,x+h,y);
end
fprintf(‘\n‘);
%改进的欧拉法
y=1;
fprintf(‘改进的欧拉法:x=%f, y=%f\n‘,0,1);
for i=1:1/h
    x=(i-1)*h;
    K1=f(x,y);
    K2=f(x+h,y+h*K1);
    y=y+(h/2)*(K1+K2);
    fprintf(‘改进的欧拉法:x=%f, y=%f\n‘,x+h,y);
end
fprintf(‘\n‘);
 %龙格库塔方法
 y=1;
fprintf(‘龙格库塔法:x=%f, y=%f\n‘,0,1);
for i=1:1/h
    x=(i-1)*h;
    K1=f(x,y);
    K2=f(x+h/2,y+(h/2)*K1);
    K3=f(x+h/2,y+(h/2)*K2);
    K4=f(x+h,y+h*K3);
    y=y+(h/6)*(K1+2*K2+2*K3+K4);
    fprintf(‘龙格库塔法:x=%f, y=%f\n‘,x+h,y);
end

结果:

>> R_K(0.2)
欧拉法:x=0.000000, y=1.000000
欧拉法:x=0.200000, y=0.800000
欧拉法:x=0.400000, y=0.614400
欧拉法:x=0.600000, y=0.461321
欧拉法:x=0.800000, y=0.343519
欧拉法:x=1.000000, y=0.255934

改进的欧拉法:x=0.000000, y=1.000000
改进的欧拉法:x=0.200000, y=0.807200
改进的欧拉法:x=0.400000, y=0.636118
改进的欧拉法:x=0.600000, y=0.495044
改进的欧拉法:x=0.800000, y=0.383419
改进的欧拉法:x=1.000000, y=0.296974

龙格库塔法:x=0.000000, y=1.000000
龙格库塔法:x=0.200000, y=0.804636
龙格库塔法:x=0.400000, y=0.631465
龙格库塔法:x=0.600000, y=0.489198
龙格库塔法:x=0.800000, y=0.377225
龙格库塔法:x=1.000000, y=0.291009
>> R_K(0.4)
欧拉法:x=0.000000, y=1.000000
欧拉法:x=0.400000, y=0.600000
欧拉法:x=0.800000, y=0.302400

改进的欧拉法:x=0.000000, y=1.000000
改进的欧拉法:x=0.400000, y=0.651200
改进的欧拉法:x=0.800000, y=0.405782

龙格库塔法:x=0.000000, y=1.000000
龙格库塔法:x=0.400000, y=0.631625
龙格库塔法:x=0.800000, y=0.377556
>> R_K(1)
欧拉法:x=0.000000, y=1.000000
欧拉法:x=1.000000, y=0.000000

改进的欧拉法:x=0.000000, y=1.000000
改进的欧拉法:x=1.000000, y=0.500000

龙格库塔法:x=0.000000, y=1.000000
龙格库塔法:x=1.000000, y=0.303395

注意:在步长h为0.4时,要将for i=1:1/h改为for i=1:0.8/h。

原文地址:https://www.cnblogs.com/kailugaji/p/10278619.html

时间: 2024-07-31 12:10:22

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

MATLAB常微分方程的数值解法

一.实验目的 科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是求未知函数在一系列离散点处的近似值. 二.实验原理 三.实验程序 1. 尤拉公式程序 四.实验内容 选一可求解的常微分方程的定解问题,分别用以上1, 4两种方法求出未知函数在 节点处的近似值,并对所求结果与分析解的(数值或图形)结果进行比较. 五.解答(按如下顺序提交电子版) 1.(程序) 求解初值问题 取n=10 源程序: euler23.m: function [A1,A2,B1,B2,C1,C2]=euler23(a,

改进cocos2dx中lua读ccb的方法

cocos2dx自带的CCBProxy真弱,还好提供了一个CCBReaderLoader.lua,但是也不好用, 于是修改了一下CCBReaderLoader,下面直接贴代码了. function NewCCBuilderReaderLoad(strFilePath,proxy,owner) if nil == proxy then return end --print("ccbnew") local ccbReader = proxy:createCCBReader() local

人工智能改进传统云ERP的10种方法

http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一致性,而忽视了客户的需求变化,导致系统缺乏灵活性,已经无法满足当今数字业务模型的增长需求.目前,人工智能(AI).机器学习发展迅速,成为了很多企业的必备帮手,云ERP供应商要想解决传统ERP系统的问题,或许需要这两大王者的帮助! 用更高的智慧和洞察力挽救传统ERP系统 要想新的商业模式取得成功,企业

龙格库塔求解常微分方程

fun.m添加微分方程,通过RK递推下一时刻的函数值 主函数如下: n=90; x=zeros(1,n+1); y=zeros(1,n+1); x(1)=0; y(1) =1; %初值 h=0.1; for i =1:n x(i+1) = x(i) + h; y(i+1) = RK(@fun,x(i),y(i),h); end plot(x,y,'-o') fun.m如下:y' = 2*(1-y/20)*y -x; function dy= fun(x,y) dy = 2*(1-y/20)*y

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

计算方法(四)带初值的常微分方程解法

实现了一些常见的带初值的常微分方程的算法. /// <summary> /// 欧拉迭代公式,求出区间(x0,x]中每隔步长h的精度为e的近似值 /// </summary> /// <param name="fun">fun为x的函数即 dy/dx=fun(x,y)</param> /// <param name="N">将区间分为N段</param> /// <param name=&

计算方法简介

简介: 计算方法又称“数值分析”.是为各种数学问题的数值解答研究提供最有效的算法. 笔记: 1误差与原则 (1)误差种类:模型误差.观测误差.截断误差和舍入误差. (2)法则: (a)加减运算:近似数加减时,把其中小数位数较多的数四舍五入,使其比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者相同. (b)乘除运算:近似数乘除时,各因子保留位数应比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者位数至多少一位. (c)乘方与开方运算:近似数乘方与开

[数学]midpoint 法

原理思想 中点法是龙格-库塔方法的二阶的一种形式 了解龙格-库塔的思想和求解:龙格-库塔方法RK. 公式 \[k1 = f(x_i,y_i)\] \[k2 = f(x_i+0.5h,y_i+0.5h)\] \[y_{i+1} = y_i+hk2\] MATLAB 代码 fun = @(x,y) (x+y); myans = midpoint_method(fun,0,2,1,0.25); hold on; % 准确值 xx = 0:0.25:1; yy = 3*exp(xx)-xx-1; plo

欧拉法求解微分方程

by Conmajia 2014 原文是我在2014年写的,用C# 完成,这里改成JavaScript了,特基础.当然最方便的还是用数学库,或者Matlab.Mathematics这些数学软件(如果你只求值的话),或者可以换成C.Java.Go.Erlang任何其他的语言实现.欧拉(Euler)和中心差分逼近,是最朴素的想法,可惜代数精度太低了,而龙格库塔的稳定性又是个问题.总之只能用来计算普通的东西,高大上问题一般还是使用广义$\alpha$,Wilson-$\Theta$之类的,利用系数调节