gpt4 book ai didi

python - 在 Python optimize.root 中将参数传递给目标函数

转载 作者:太空宇宙 更新时间:2023-11-03 17:33:37 25 4
gpt4 key购买 nike

我正在使用optimize.root来查找方程组的数值解。我需要将每个条件表示为单独的函数,并且还需要向某些条件传递参数。然而,如果计算是在目标函数本身内完成的,而不是在目标函数调用的单独函数中完成的,那么 optimize.root 似乎只能正确传递参数。

以下代码复制了该问题:

# Conditions to be solved
def fSSBj(inp):
return (0.5*inp[1])/(1+inp[1])-0.9*inp[0]
def fSSBJ(inp):
return inp[0]-inp[2]*inp[1]

# Objective function with conditions inserted directly
def objFunc1(inp,pM):
out = empty(2)
out[0] = (0.5*inp[1])/(1+inp[1])-0.9*inp[0]
out[1] = inp[0]-pM*inp[1]
return out

# Objective function that calls the functions with the conditions
def objFunc2(inp,pM):
out = empty(2)
out[0] = fSSBj(inp+[pM])
out[1] = fSSBJ(inp+[pM])
return out

请注意,两个目标函数使用相同的输入;他们也给出相同的输出:

print objFunc1([1.0,1.0],0.2)
print objFunc2([1.0,1.0],0.2)

这两个命令都会返回

[-0.65  0.8 ]

但是,问题是以下两个命令给出的结果截然不同:

Out1 = optimize.root(objFunc1, [1.0,1.0], args = (0.2), method='hybr')
Out2 = optimize.root(objFunc2, [1.0,1.0], args = (0.2), method='hybr')

第一个效果很好;第二个给出错误消息(索引超出范围)。 optimize.root 将参数传输到函数的方式是否存在问题?

这对我来说是一个问题,因为(1)我有不同的条件需要解决; (2) 我需要进行一阶导数来生成雅可比函数。由于这两个原因,我使用 SymPy 的 lambdify 函数来生成函数及其导数,并将它们包含在目标函数中。

最佳答案

我假设 numpy 将您的输入列表转换为 ndarray

不幸的是,

>> [1,1] + [0.2]
[1, 1, 0.2]

>> np.array([1,1]) + [0.2]
array([ 1.2, 1.2])

因此,您会收到 IndexError

关于python - 在 Python optimize.root 中将参数传递给目标函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com