Fortran 微分方程求解 --ODEPACK

2023-11-09

最近涉及到使用Fortran对微分方程求解,我们知道MATLAB已有内置的函数,比如ode家族,ode15s,对应着不同的求解办法。通过查看odepack的官方文档,我尝试使用了dlsode求解刚性和非刚性常微分方程组。

首先是github网址:https://github.com/jacobwilliams/odepack

具体使用办法:

1.我使用的是vs2022,比较简单的用法就是把,src文件夹所有的文件复制到和项目一个文件夹即可,将M_odepack.f90文件放入到项目中,这样就可以用了。

2.在使用前要use m_odepack

3.这里以官方文档中的例子为例:

program dlsode_ex
use m_odepack
implicit none
external fex
external jex

integer,parameter            ::  dp=kind(0.0d0)
real(kind=dp),dimension(3)   ::  atol,y
integer                      ::  iopt,iout,istate,itask,itol,liw,lrw,mf,neq
integer,dimension(23)        ::  iwork
real(kind=dp)                ::  rtol,t,tout
real(kind=dp),dimension(58)  ::  rwork

   neq = 3
   y(1) = 1.D0
   y(2) = 0.D0
   y(3) = 0.D0
   t = 0.D0
   tout = .4D0
   itol = 2
   rtol = 1.D-4
   atol(1) = 1.D-6
   atol(2) = 1.D-10
   atol(3) = 1.D-6
   itask = 1
   istate = 1
   iopt = 0
   lrw = 58
   liw = 23
   mf = 21
   do iout = 1,12
      call dlsode(fex,[neq],y,t,tout,itol,[rtol],atol,itask,istate,iopt,   &
                & rwork,lrw,iwork,liw,jex,mf)
      write (6,99010) t,y(1),y(2),y(3)
   99010 format (' At t =',d12.4,'   y =',3D14.6)
      if ( istate<0 ) then
         write (6,99020) istate
   99020 format (///' Error halt.. ISTATE =',i3)
         stop 1
      else
         tout = tout*10.D0
      endif
   enddo
   write (6,99030) iwork(11),iwork(12),iwork(13)
   99030 format (/' No. steps =',i4,',  No. f-s =',i4,',  No. J-s =',i4)

end program dlsode_ex

subroutine fex(Neq,T,Y,Ydot)
implicit none
integer,parameter                         ::  dp=kind(0.0d0)

integer                                   ::  Neq
real(kind=dp)                             ::  T
real(kind=dp),intent(in),dimension(3)     ::  Y
real(kind=dp),intent(inout),dimension(3)  ::  Ydot

   Ydot(1) = -.04D0*Y(1) + 1.D4*Y(2)*Y(3)
   Ydot(3) = 3.D7*Y(2)*Y(2)
   Ydot(2) = -Ydot(1) - Ydot(3)
end subroutine fex

subroutine jex(Neq,T,Y,Ml,Mu,Pd,Nrpd)
implicit none

integer,parameter                              ::  dp=kind(0.0d0)
integer                                        ::  Neq
real(kind=dp)                                  ::  T
real(kind=dp),intent(in),dimension(3)          ::  Y
integer                                        ::  Ml
integer                                        ::  Mu
real(kind=dp),intent(inout),dimension(Nrpd,3)  ::  Pd
integer,intent(in)                             ::  Nrpd

   Pd(1,1) = -.04D0
   Pd(1,2) = 1.D4*Y(3)
   Pd(1,3) = 1.D4*Y(2)
   Pd(2,1) = .04D0
   Pd(2,3) = -Pd(1,3)
   Pd(3,2) = 6.D7*Y(2)
   Pd(2,2) = -Pd(1,2) - Pd(3,2)
end subroutine jex

一些变量意义具体看文档说明:https://jacobwilliams.github.io/odepack/proc/dlsode.html

其中,假设n是方程个数,

y:是初值,数组,y(n)

atol:每个方程的绝对误差,数组,atol(n)

t:输入的初始点,tout是下一个点。

mf:是求解方法,其中如果等于21,24需要使用者自己提供雅各比矩阵,如示例代码中jex函数中那样,如果等于10,22,25则不需要自己写,但是jex函数还是需要定义,就是函数框架,函数名,变量声明就可。

fex函数:写的就是你的微分方程组

另外,

 rwork,iwork也是两个一维数组,大小如图所示。

以及,

lrw = 22 +  9*NEQ + NEQ**2
liw = 20 + NEQ

整体使用的逻辑就是先设置t值,然后设置循环,tout不断累加,下次循环就使用上次计算得到的新y值以及tout进行迭代计算。

istate是用于输入和输出以指定计算状态的索引,要注意的是如果istate选择2,或3需要在第一次循环中等于1,初始化,到了第二次循环开始才赋值为2或3。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran 微分方程求解 --ODEPACK 的相关文章

随机推荐

  • Microsoft MSDT任意代码执行漏洞(CVE-2022-30190)

    Microsoft Windows 支持诊断工具 MSDT 远程代码执行漏洞复现过程 漏洞描述 MSDT Microsoft Support Diagnostics Tool 微软支持诊断工具 是一种实用程序 用于排除故障并收集诊断数据以供
  • ROW_NUMBER() OVER函数的基本用法 / Rank() over()的用法

    转自 http www cnblogs com icebutterfly archive 2009 08 05 1539657 html 语法 ROW NUMBER OVER PARTITION BY COLUMN ORDER BY COL
  • Processing如何打包导出中文字体

    Processing如何打包导出中文字体 文章目录 Processing如何打包导出中文字体 原理 步骤 用途 原理 使用Processing自带的字体创建工具 创建 vlw字体 该工具为每个character创建一个贴图 然后将它们作为
  • 教你如何根据需求编写测试用例,不用写一行代码,使用ChatGPT4自动完成。

    首先来张效果图 需求我是放到requirements txt文档里 输出的测试用例是放到test case1 txt 整个代码我是让ChatGPT4自动给我写的 我用的prompt提示语是 我的想法是这样 通过Python代码 和API k
  • Android中的指纹识别

    1 第一步首先在build gradle中导入咱们的指纹识别依赖 dependencies implementation androidx appcompat appcompat 1 1 0 implementation com googl
  • 什么是线程同步和线程异步?

    1 什么是线程同步和线程异步 线程同步 是多个线程同时访问同一资源 等待资源访问结束 浪费时间 效率不高 线程异步 访问资源时 如果有空闲时间 则可在空闲等待同时访问其他资源 实现多线程机制 异步处理就是 你现在问我问题 我可以不回答你 等
  • C++11中enable_shared_from_this的用法解析

    什么是 enable shared from this 下面摘自 cpp reference 中概述 C 11 开始支持 enable shared from this 它是一个模板类 定义在头文件
  • RestHighLevelClient集成ES 7.X

    Maven依赖 依赖版本号和elasticsearch版本号对应起来
  • java基础三(运算符)

    标识符 在Java语言中 与类无关的运算符只有赋值运算符 算术运算符 关系运算符 逻辑运算符和位运算符 赋值运算符 符号为 作用是将数据 变量或对象赋值给相应类型的变量或对象 例如 int a 5 将数据复制给变量 long b a 将变量
  • jmeter切换JDK版本

    tomcat设置固定的JDK tomcat bin vi setclasspath sh 最上面添加可以生效 export JAVA HOME usr local jdk1 8 0 131 export JRE HOME usr local
  • 肖飒:央行数字货币与反洗钱,你怎么看?

    商务部在今年8月14日印发的 全面深化服务贸易创新发展试点总体方案 中提到 在京津冀 长三角 粤港澳大湾区及中西部具备条件的试点地区开展数字人民币试点 而就在几天前 深圳罗湖数字人民币红包活动正式落幕 中国数字货币在深圳打响了 第一枪 10
  • JAVA单元测试框架-11-异常测试

    预计测试会出现异常 可以使用 Test expectedExceptions 来验证是否有异常抛出 import org testng Reporter import org testng annotations DataProvider
  • AIGC之常见LLM免费使用

    文章目录 1 前言 2 常见LLM免费使用方法 部分网站需要使用魔法 2 1 GPT 4 GPT 3 5 16k国内镜像 2 2 GPT 3 5 国内镜像 2 3 LLM国外综合网站 3 总结 1 前言 自从ChatGPT在2022年底横空
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻

    目录 前言 方案一 echarts 百度地图 获取百度地图AK 安装echarts和引入百度地图api 完整使用代码 方案二 echarts地图和柱状图变形动画 实现思路 完整使用代码 方案三 中国地图和各省市地图下钻 实现思路 完整使用代
  • SpringBoot中启动类的存放位置

    如有错误 请多指教 不能直接放在main java 文件下 启动类所在的包是最顶部的包 不能直接放在main java 文件下 ps BootQueueConsumerApplication是启动类 否则会直接报错 如下图 启动类所在的包是
  • java jdbc 故障转移,MySQL JDBC连接上的故障转移?

    I am trying to determine how i could implement a high availablity solution using the MySQL JDBC driver it seems that the
  • 最全的Java笔试题库之选择题篇-总共234道【121~180】

    121 EJB的优点有哪些 选择2项 A 技术领先 B 价格低廉 C 性能优越 D 强大的容器支持 解答 CD 122 以下哪些接口能够实现对Web访问者的身份认证 选择1项 A Http Servlet Request B Http Se
  • Linux用户切换到root后运行图形程序报错(*GLib-GIO-CRITICAL **)

    用su切换到root用户后 运行某些带图形的程序 会报如下错误 ImageProc qt 3158 GLib GIO CRITICAL g dbus connection register object assertion G IS DBU
  • iOS进阶_密码学(二.钥匙串访问)

    网络开发中的原则 在网络上不允许传输用户的明文隐私数据 在本地不允许保存用户的明文隐私数据 类似于QQ 微信的记住密码 在客户端本地保存用户加密后的密码 NSUserDefaults 明文保存才能反算 能够反算的算法 钥匙串访问 开放给开发
  • Fortran 微分方程求解 --ODEPACK

    最近涉及到使用Fortran对微分方程求解 我们知道MATLAB已有内置的函数 比如ode家族 ode15s 对应着不同的求解办法 通过查看odepack的官方文档 我尝试使用了dlsode求解刚性和非刚性常微分方程组 首先是github网