如何在scipy.optimize.newton的每次迭代中更新非优化参数
解决方案
方法1:用可变容器传递ap
Python里不可变类型(比如数值)作为参数传递时,函数内的修改不会影响外部变量,但可变容器(比如列表)是引用传递,修改内部元素会同步到外部。你可以把ap包装在列表里,这样每次迭代时函数内更新列表元素,外部的ap状态就会跟着变。
示例代码:
from scipy.optimize import newton def func(a, ap_container, etc): # 执行你的计算逻辑 a_1 = some_calculation(a, ap_container[0], etc) ap_1 = another_calculation(a, ap_container[0], etc) # 更新ap的容器元素 ap_container[0] = ap_1 # 返回牛顿法需要的残差 return a - a_1 # 初始化ap,用列表包装 initial_ap = 1.0 ap_container = [initial_ap] initial_a = 0.5 etc_params = ... # 你的其他参数 # 调用牛顿法 root = newton(func, initial_a, args=(ap_container, etc_params)) # 迭代结束后,ap_container[0]就是最后更新的ap值 final_ap = ap_container[0]
方法2:用类封装状态
如果你的计算逻辑比较复杂,用类来封装ap的状态会更清晰,把ap作为实例属性,每次调用类的方法时直接更新这个属性。
示例代码:
from scipy.optimize import newton class Calculator: def __init__(self, initial_ap, etc_params): self.ap = initial_ap self.etc = etc_params def func(self, a): # 执行计算 a_1 = some_calculation(a, self.ap, self.etc) ap_1 = another_calculation(a, self.ap, self.etc) # 更新实例的ap属性 self.ap = ap_1 return a - a_1 # 初始化实例 initial_ap = 1.0 etc_params = ... calc = Calculator(initial_ap, etc_params) # 调用牛顿法,把类的方法作为目标函数 root = newton(calc.func, initial_a) # 迭代结束后,calc.ap就是最终的ap值 final_ap = calc.ap
关于全局变量失效的说明
你之前用全局变量没生效,大概率是因为函数内没有用global关键字声明要修改全局变量,或者在函数内重新赋值了ap(相当于创建了局部变量)。比如如果函数里写ap = ap_1却没加global ap,那修改的是局部变量,不会影响全局的ap。但即使能用全局变量,也不推荐,因为会让代码耦合度高,可变容器或类的方式更优雅。
内容的提问来源于stack exchange,提问作者Jackson_Hardin_617
相关产品推荐
相关产品推荐

