使用ForwardDiff计算函数梯度时报Float64不可调用错误求助
错误成因
这个报错的触发逻辑非常直接:
- 核心传参错误:
ForwardDiff.gradient的第一个参数必须是可调用的函数对象,你写的ForwardDiff.gradient(f(x), x)会先执行f(x)得到一个Float64类型的标量计算结果,再把这个纯数值传给gradient。gradient内部会尝试将第一个入参作为函数调用,传入自动微分专用的Dual类型输入做微分计算,对Float64数值做调用操作自然会抛出objects of type Float64 are not callable的方法错误。 - 代码还存在其他隐藏问题,就算修正传参也会继续报错:
- 函数
f内部引用了从未定义过的变量alpha,运行时会直接触发未定义变量错误 - 函数参数标注
x::Vector属于不必要的严格类型限制,ForwardDiff传入的Dual类型向量虽然能匹配这个抽象类型,但写死Vector类型容易在后续扩展时触发类型匹配问题,更稳妥的方式是不写类型标注,或者标注为AbstractVector。
- 函数
修正后的可运行示例
using ForwardDiff buffer1 = 1.0 buffer2 = 1.0 - buffer1 buffers = [buffer1; buffer2] K0 = [[100.0, 200.0] [0.01, 0.001]] q_sat = [100, 150] K = exp.(log.(K0) * buffers) # 按实际业务场景补全alpha的取值 alpha = [1.0, 1.0] # 移除不必要的严格类型注解 f(x) = q_sat[1] * (K[1]*x[1] / (1 + alpha[1]*K[1]*x[1] + alpha[2]*K[2]*x[2])) x = [0.5; 0.5] # 第一个参数传入函数对象f,而非f(x)的求值结果 g = ForwardDiff.gradient(f, x)
内容的提问来源于stack exchange,提问作者gauss134
相关产品推荐
相关产品推荐

