在 Fortran 牛顿法中传递附加参数

2023-12-05

我在实现在 Fortran 程序中调用牛顿法的方法时遇到问题。 所以我想用牛顿法来求解以下方程the link

但是,我的程序与上面的示例略有不同。就我而言,方程需要一些在运行时产生的附加信息。

subroutine solve(f, fp, x0, x, iters, debug)

这意味着 f 不仅基于 x 计算,还基于其他一些变量(但 x 是未知的)。

我有一个解决方案,仅适用于简单的情况: 我使用了一个模块来包含牛顿求解器。我还定义了一个派生数据类型来保存模块内的所有参数。现在效果很好。

我的问题是:我需要多次调用牛顿方法,每次参数都不同。我应该如何设计模块的结构?或者我应该使用不同的解决方案?

我在下面提供了一个简单的例子:

module solver
  type argu
    integer :: m
  end type argu
  type(argu):: aArgu_test  !should I put here?
  contains
    subroutine solve(f, fp, x0, x, iters, debug)
       ...
       !m is used inside here
    end subroutine solve
    subroutine set_parameter(m_in)
       aArgu%m = m_in
    end subroutine set_parameter()

end module solver

调用模块是:

!only one set of argument, but used many times
module A
   use module solver

   do i = 1, 4, 1
     set_parameter(i) 
     !call Newtow method
     ...
   enddo
end module A

!can I use an array for argu type if possible?
module B
   use module solver
   type(argu), dimension(:), allocable :: aArgu ! or should I put here or inside solver module?

end module B

我的理解是,如果我将 argu 对象放入求解器模块中,那么所有求解器调用都将使用相同的参数(我仍然可以使用上述方法将它们全部保存在模块 A 中)。在这种情况下,我必须在每个 for 循环期间更新参数?

因为程序使用 MPI/OpenMP 运行,所以我想确保线程之间不会被覆盖。 谢谢。


对于您所面临的问题,现代 Fortran 有一个常见的模式(部分函数应用)。与其他语言不同,Fortran 没有函数闭包,因此为函数创建词法作用域有点“复杂”并且有点有限。

您确实应该考虑重新访问 @VladmirF 在评论中共享的所有链接,其中大多数直接适用于您的案例。我会给你一个解决方案的例子。

这是不使用包装类型的解决方案。我将使用 Fortran 2008 标准中包含的一项功能:将内部过程作为参数传递。它与最新的 gfortran、Intel 等兼容。 如果您无法访问具有此功能的编译器或者您更喜欢具有派生类型的解决方案,您可以参考this answer.

module without_custom_type
  use, intrinsic :: iso_fortran_env, only: r8 => real64
  use :: solver

contains
  subroutine solve_quad(a, b, c, x0, x, iters, debug)
    integer, intent(in) :: a, b, c
    real(r8), intent(in) :: x0
    real(r8), intent(out) :: x
    integer, intent(out) :: iters
    logical, intent(in) :: debug

    call solve(f, fp, x0, x, iters, debug)

  contains
    real(r8) function f(x)
      real(r8),intent(in) :: x
      f = a * x * x + b * x + c
    end

    real(r8) function fp(x)
      real(r8),intent(in) :: x
      fp = 2 * a * x + b
    end
  end
end

这段代码的基本原理是:f and fp躺在里面的solve_quad过程中,他们可以访问参数a, b and c由主机关联,而不触及这些函数的签名。产生的效果就像改变函数的数量一样。

使用 gfortran 8.0 和solver从您共享的链接实现,我得到了这个:

program test
  use, intrinsic :: iso_fortran_env, only: r8 => real64
  use :: without_custom_type
  implicit none

  real(r8) :: x, x0
  integer :: iters
  integer :: a = 1, b = -5, c = 4

  x0 = 0
  call solve_quad(a, b, c, x0, x, iters, .false.)
  print *, x, iters
  ! output: 1.0000000000000000, 5

  x0 = 7
  call solve_quad(a, b, c, x0, x, iters, .false.)
  print *, x, iters
  ! output: 4.0000000000000000, 6    
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Fortran 牛顿法中传递附加参数 的相关文章

  • Fortran if stop 需要 endif 吗?

    在 fortran 90 中 if stop 语句是否需要结束 endif example if foo eq 1 stop do some stuff do some stuff 是循环的一部分还是 stop 意味着程序结束时 endif
  • createNativeQuery 设置参数

    我有以下内容 其中包含 NativeQuery 我需要在其中设置参数 但有些事情是错误的 因为未设置参数 因此查询是 SELECT movieId title genres FROM movies where title like 所以返回
  • 在参数化中传递 pytest 夹具

    通过在 pytest mark parametrize 中传递 conftest py 中定义的装置 我收到以下错误 pytest alist 0220 0221 test 1 py v s NameError name alist is
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • WP7:将参数传递到新页面?

    在 Windows Phone 7 Silverlight 应用程序中 我使用以下命令调用新页面 NavigationService Navigate new Uri View SecondPage xaml UriKind Relativ
  • f951 错误:无法识别的命令行选项

    我在linux上 正在编译以下内容 mpif90 shared source F90 object1 o object2 o L some path Qoption link rpath some path I some path lhdf
  • 识别操作系统

    我在 Intel 编译器上的 Fortran 90 代码取决于它运行的操作系统 例如 if OS win7 then do X else if OS linux then do y end if 我如何以编程方式执行此操作 您可以使用预处理
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • Python/curve_fit:无法通过初始化猜测传递数组

    我有这个函数来计算某种多项式 def pipoly df pj n np size pj p pj 0 for j in range 1 n p pj j df j return p pj应该是一个包含多项式系数的初始猜测的数组 因此 多项
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 将 this 作为静态方法中的参数传递

    我在使用 Visual C for Windows Phone 中的某些代码时遇到一些问题 问题不在于它不起作用 因为它确实起作用 但我不明白如何 P 在静态类中 创建一个静态方法 该方法将自身作为参数 public static void
  • 创建 SYS_REFCURSOR 并将其作为输入参数从 Java 传递给 Oracle 过程

    我必须与具有 SYS REFCURSOR 作为输入参数的外部 Oracle 过程进行通信 过程 merge objects varchar2 中的 p table name p id array 中 varchar2 SYS REFCURS
  • Fortran :: (1) 处 OPEN 语句中存在语法错误

    我试图通过 顽固测试 来测试我的密码算法 http stat fsu edu pub diehard http stat fsu edu pub diehard 我意识到我的输入文件必须是未格式化的直接访问文件 所以我尝试用 Fortran
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • Fortran 正在读取超出结束文件记录的内容

    我正在尝试从文件中读取一些数据 而结束文件记录检测对于停止读取非常重要 但是 根据用于读取数据的数组的数组维度 我无法正确检测结束文件记录 并且我的 Fortran 程序停止 程序如下 integer dimension 3 x line
  • 分发编译后的 fortran 库和模块文件

    我有一个Fortran使用很多模块的库 我用ifortWindows 上的编译器 因此 我得到一个 lib图书馆的文件和 mod所用模块的文件 这有一个缺点 我还必须分发 mod文件 如果我想在另一个程序中使用编译的库 如何防止这种情况发生
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统

随机推荐

  • Android 的子类按钮:很多错误

    我尝试子类化Button 但是我在启动项目时遇到很多错误 你能看一下并告诉我如何解决这个问题吗 我可能会出现 50 个错误 package my project name import android public class MyButt
  • 查找函数无法更新特定位置的文件 - python

    我实际上正在开发一个使用 UDP 发送文件的项目 由于该协议不可靠 我在每个数据包上添加了一些信息 即数据的索引 这样我就可以按照正确的顺序写入接收到的数据 我在文件中的特定位置写入字节时遇到问题 这是我的代码中处理写入新数据的部分 whi
  • 用什么来代替 ::ng-deep

    我正在尝试以角度设置路由器出口放置的元素的样式 并希望确保生成的元素的宽度为 100 从大多数回复中 我发现我应该使用 ng deep选择器 但是来自 Angular 的docs它正在被弃用 有没有替代方案 ng deep FWIW 在我的
  • 十六进制字符串到图像

    我有一个十六进制字符串 如下所示 String hexImage 0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C 我需要使用 Java
  • 如何在asp.net中启用角色?

    我正在尝试在 ASP NET 中启用角色 但是 我收到了一些错误 并且在尽力之后我无法解决它们 我是 Visual Studio 界面的新手 我尝试创建一个登录页面作为 ASP NET Web 应用程序 然后 由于我们必须配置页面以连接到数
  • WP8 IE10 视口问题

    你们是否注意到 当使用 ms viewport 特定宽度为 320px 或设备宽度 时 Web 浏览器内容可以移动到可用空间之外 似乎文档大小错误 因此我可以将其内容滚动到左侧 但没有任何空白 我也可以将其缩小 但我不应该 之后它的大小并不
  • 使用ggplot2绘制不同颜色的多条线

    我有一个数据框 其中包含年份列 1980 2009 和 16 列 其中包含来自 16 个不同模型的气象数据 因此每个值代表一年和一个模型的年值 下面是一些代码 可以很容易地重现 set seed 20 df lt as data frame
  • 如何在显示表单后运行代码? (“显示”有问题。)

    我想Shown就是答案 但似乎并非所有控制都是平等的 一个面板is立即显示 而标签则不显示 我有以下代码 public partial class Form2 Form Panel p new Panel BackColor Color G
  • Ng-animate 停止使用 $templateRequest 装饰器工作

    当我的用户未经身份验证时 我试图避免使用 Angular js 出现模板错误 为了做到这一点 我来到了这个堆栈溢出解决方案 它对我有用 但现在我注意到我的 ng animate 停止工作而没有抛出控制台错误 我缺少什么 Update 这是使
  • if 语句中的布尔值

    今天 我收到了关于代码的评论 考虑到我在学校作业中检查变量是真还是假的方式 我写的代码是这样的 var booleanValue true function someFunction if booleanValue true return
  • oracle中需要修剪空格

    无法修剪表中以下数据中的空格 列数据类型为 VARCHAR2 650 CHAR 我尝试了修剪功能来消除空白 但这对我不起作用 我的表中的数据 xxxxxxxxxx yyyyyyyyy 12 7 14 12 13 14 xxxxxxxxxx
  • 分配给 BigInteger 数组中的 an 元素时出错

    这是我的代码 当我创建数组时它显示错误BigInteger并尝试赋值 package test import java math import java lang import java util public class Test pub
  • Tomcat工作目录必须定期清理

    我们的 Tomcat 遇到了一个问题 我的同事都无法真正解释 我们有一只雄猫 版本7 0 26 在 Linux 计算机上 部署是通过爆炸战争 我们的类是jar打包的 其余的直接进入WEB INF和META INF 另外还有一个内容管理服务器
  • Spring Security 6 和 JSP 视图渲染

    我正在将应用程序从 Spring Boot 2 7 升级到 Spring Boot 3 其中包括更新到 Spring Security 6 我们设置了以下属性 spring mvc view prefix WEB INF view spri
  • 从 RStudio EC2 实例中的 S3 读取大型 JSON 文件(Louis Aslett 的 AMI)

    我正在经历与这个问题类似的问题here 我在 AWS S3 上有一个大的 JSON 文件 并尝试通过 RStudio 来自 Louis Aslett 的 AMI 的 EC2 实例 访问它 我什至尝试从 t2 迁移到具有 30GB 内存的 r
  • 使用 CSS 变换倾斜后应用于位置 div 的边距

    可能比 CSS 更多的数学知识 但我正在尝试确定一种在应用 CSS skewY 变换后调整 div 位置的方法 在下面的代码片段中 带有蓝色边框的 div 应用了 3 5 度的倾斜度 我想知道是否有数学方法可以知道倾斜度是多少top应用于蓝
  • 序列化多部分表单请求以在 Play 2.1 上进行测试

    我正在为 play2 1 编写一个使用路由函数的多部分表单的后置控制器测试 route FakeRequest POST postControllerRoute url FakeHeaders Seq HeaderNames CONTENT
  • Powershell 中的 New-Object -ComObject 和 VB 中的 CreateObject() 有什么区别?

    我有一个关于 Windows PowerShell 在处理 Com Interop 时如何工作的问题 我有一个第三方应用程序 我们称之为ThirdPartyApp 公开了一个我可以调用的 API 我可以提前绑定它 例如Excel 或 Vis
  • Bokeh 自动填充日期时间轴缺失值:如何停止?

    我正在尝试构建一个交互式情节pandas dataframe的财务数据 当市场休市或周末时 数据帧指数存在一些差距 问题是 当我使用数据帧索引作为 xasis 时 Bokeh 总是自动填充这些空白 使其在视觉上很难看 如何才能无间隙地打印数
  • 在 Fortran 牛顿法中传递附加参数

    我在实现在 Fortran 程序中调用牛顿法的方法时遇到问题 所以我想用牛顿法来求解以下方程the link 但是 我的程序与上面的示例略有不同 就我而言 方程需要一些在运行时产生的附加信息 subroutine solve f fp x0