SciPy根函数调用之间的值不一致
SciPy root inconsistent values between function calls
使用 opt.root,我想存储调用函数的参数。
import scipy.optimize as opt
x0=[0, 0]
prev_x=x0
count=0
def fun(x):
global prev_x,count
print('---')
print('iteration',count)
count+=1
print('last iteration',prev_x)
print('this iteration',x)
prev_x=x
return x[0]**2*x[1]+1,x[1]-x[0]+2
result=opt.root(fun,x0,method='lm')
我希望对于每个迭代步骤,last_x 中保存的值应该与上一次迭代的当前值相匹配。
运行 上面的代码,我得到了不同的值,例如迭代 8 和 9.
我是否遗漏了一些关于 Python and/or SciPy 的基本行为,或者这是一个错误?
[edit] 我将问题缩短到要点。
分配列表不会复制值,只是给它一个不同的名称,因此通过一个名称对列表的更改会反映在另一个名称中。要获得您期望的行为,请将相关行更改为
prev_x=x.copy()
(注意 copy()
位)
使用 opt.root,我想存储调用函数的参数。
import scipy.optimize as opt
x0=[0, 0]
prev_x=x0
count=0
def fun(x):
global prev_x,count
print('---')
print('iteration',count)
count+=1
print('last iteration',prev_x)
print('this iteration',x)
prev_x=x
return x[0]**2*x[1]+1,x[1]-x[0]+2
result=opt.root(fun,x0,method='lm')
我希望对于每个迭代步骤,last_x 中保存的值应该与上一次迭代的当前值相匹配。 运行 上面的代码,我得到了不同的值,例如迭代 8 和 9.
我是否遗漏了一些关于 Python and/or SciPy 的基本行为,或者这是一个错误?
[edit] 我将问题缩短到要点。
分配列表不会复制值,只是给它一个不同的名称,因此通过一个名称对列表的更改会反映在另一个名称中。要获得您期望的行为,请将相关行更改为
prev_x=x.copy()
(注意 copy()
位)