NLsolve.jl传递静态参数遇MethodError,求正确传参方式
解决NLsolve.jl中传递常量参数k的问题
你遇到的核心问题是闭包的函数签名和NLsolve要求的不匹配——NLsolve调用目标函数和Jacobian函数时,会自动传入两个参数:第一个是用来存储计算结果的数组(残差数组F或雅可比矩阵J),第二个才是未知量数组U,但你定义的闭包只接受U这一个参数,所以触发了MethodError。
下面给你两种可行的修正方案:
方案1:修正闭包的函数签名
直接让闭包接受输出数组和未知量数组两个参数,再把常量k传递给你的fun!和jac!:
# 修正后的残差计算闭包,接受F和U两个参数 f_closure!(F, U) = fun!(F, U, k) # 同理修正Jacobian矩阵计算闭包 j_closure!(J, U) = jac!(J, U, k) # 现在调用nlsolve就不会报错了 res = nlsolve(f_closure!, j_closure!, U)
方案2:直接使用匿名函数(更简洁)
不需要单独定义闭包变量,直接在nlsolve调用时用匿名函数封装参数传递:
res = nlsolve( (F, U) -> fun!(F, U, k), # 匿名函数处理残差计算,自动传递k (J, U) -> jac!(J, U, k), # 匿名函数处理雅可比矩阵计算,自动传递k U )
补充说明
NLsolve对目标函数和Jacobian函数的签名有明确要求:
- 目标函数必须是
f!(F, x)形式:第一个参数F是用来存储残差的数组(函数内部需要修改它),第二个参数x是当前迭代的未知量数组 - Jacobian函数必须是
j!(J, x)形式:第一个参数J是用来存储雅可比矩阵的数组(函数内部需要修改它),第二个参数x是当前迭代的未知量数组
你的原始闭包只接收了U,漏掉了输出数组的参数位置,这才是报错的核心原因。
内容的提问来源于stack exchange,提问作者melisale
相关产品推荐
相关产品推荐

