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

MATLAB常微分方程数值解

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

1.一阶常微分方程初值问题

2.欧拉法

 

3.改进的欧拉法

4.四阶龙格库塔方法

5.例题

用欧拉法,改进的欧拉法及4阶经典Runge-Kutta方法在不同步长下计算初值问题。步长分别为0.2,0.4,1.0.

matlab程序:

1function z=f(x,y) 2z=-y*(1+x*y); 3 4function R_K(h) 5%欧拉法 6y=1; 7fprintf('欧拉法:x=%f, y=%f\n',0,1); 8for i=1:1/h 9 x=(i-1)*h; 10 K=f(x,y); 11 y=y+h*K; 12 fprintf('欧拉法:x=%f, y=%f\n',x+h,y); 13end 14fprintf('\n'); 15%改进的欧拉法 16y=1; 17fprintf('改进的欧拉法:x=%f, y=%f\n',0,1); 18for i=1:1/h 19 x=(i-1)*h; 20 K1=f(x,y); 21 K2=f(x+h,y+h*K1); 22 y=y+(h/2)*(K1+K2); 23 fprintf('改进的欧拉法:x=%f, y=%f\n',x+h,y); 24end 25fprintf('\n'); 26 %龙格库塔方法 27 y=1; 28fprintf('龙格库塔法:x=%f, y=%f\n',0,1); 29for i=1:1/h 30 x=(i-1)*h; 31 K1=f(x,y); 32 K2=f(x+h/2,y+(h/2)*K1); 33 K3=f(x+h/2,y+(h/2)*K2); 34 K4=f(x+h,y+h*K3); 35 y=y+(h/6)*(K1+2*K2+2*K3+K4); 36 fprintf('龙格库塔法:x=%f, y=%f\n',x+h,y); 37end

结果:

1>> R_K(0.2) 2欧拉法:x=0.000000, y=1.000000 3欧拉法:x=0.200000, y=0.800000 4欧拉法:x=0.400000, y=0.614400 5欧拉法:x=0.600000, y=0.461321 6欧拉法:x=0.800000, y=0.343519 7欧拉法:x=1.000000, y=0.255934 8 9改进的欧拉法:x=0.000000, y=1.000000 10改进的欧拉法:x=0.200000, y=0.807200 11改进的欧拉法:x=0.400000, y=0.636118 12改进的欧拉法:x=0.600000, y=0.495044 13改进的欧拉法:x=0.800000, y=0.383419 14改进的欧拉法:x=1.000000, y=0.296974 15 16龙格库塔法:x=0.000000, y=1.000000 17龙格库塔法:x=0.200000, y=0.804636 18龙格库塔法:x=0.400000, y=0.631465 19龙格库塔法:x=0.600000, y=0.489198 20龙格库塔法:x=0.800000, y=0.377225 21龙格库塔法:x=1.000000, y=0.291009 22>> R_K(0.4) 23欧拉法:x=0.000000, y=1.000000 24欧拉法:x=0.400000, y=0.600000 25欧拉法:x=0.800000, y=0.302400 26 27改进的欧拉法:x=0.000000, y=1.000000 28改进的欧拉法:x=0.400000, y=0.651200 29改进的欧拉法:x=0.800000, y=0.405782 30 31龙格库塔法:x=0.000000, y=1.000000 32龙格库塔法:x=0.400000, y=0.631625 33龙格库塔法:x=0.800000, y=0.377556 34>> R_K(1) 35欧拉法:x=0.000000, y=1.000000 36欧拉法:x=1.000000, y=0.000000 37 38改进的欧拉法:x=0.000000, y=1.000000 39改进的欧拉法:x=1.000000, y=0.500000 40 41龙格库塔法:x=0.000000, y=1.000000 42龙格库塔法:x=1.000000, y=0.303395

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )