Python 在对象上使用scipy.optimize.minimize

Python 在对象上使用scipy.optimize.minimize,python,static,scipy-optimize-minimize,Python,Static,Scipy Optimize Minimize,我想用一个float x(或数组)和两个方法定义一个类:一个方法“energy”返回与x相关的能量,另一个方法“minimize_energy”最小化从x开始的能量,并用最小化的解替换x 我尝试了以下代码 #!/usr/bin/python from scipy.optimize import minimize class Position : def __init__(self): self.x = 1 def energy(self) :

我想用一个float x(或数组)和两个方法定义一个类:一个方法“energy”返回与x相关的能量,另一个方法“minimize_energy”最小化从x开始的能量,并用最小化的解替换x

我尝试了以下代码

#!/usr/bin/python
from scipy.optimize import minimize

class Position :
    def __init__(self):
        self.x = 1
    
    def energy(self) :
        return self.x**2
    
    def minimize_energy (self):
        sol = minimize(self.energy, x0=self.x)
        self.x = sol.x
        return sol.success
        
pos=Position()
print(pos.x, pos.energy())
ss = pos.minimize_energy()
print(ss, pos.x)
但是,我得到以下错误:

1.0 1.0
Traceback (most recent call last):
  File "/home/vincent/Documents/Recherche/2020/Ballon d'eau/Forme des rides/Numérique/Programmes/test_classe/test.py", line 18, in <module>
    ss = pos.minimize_energy()
  File "/home/vincent/Documents/Recherche/2020/Ballon d'eau/Forme des rides/Numérique/Programmes/test_classe/test.py", line 12, in minimize_energy
    sol = minimize(self.energy, x0=self.x)
  File "/usr/lib/python3.9/site-packages/scipy/optimize/_minimize.py", line 614, in minimize
    return _minimize_bfgs(fun, x0, args, jac, callback, **options)
  File "/usr/lib/python3.9/site-packages/scipy/optimize/optimize.py", line 1135, in _minimize_bfgs
    sf = _prepare_scalar_function(fun, x0, jac, args=args, epsilon=eps,
  File "/usr/lib/python3.9/site-packages/scipy/optimize/optimize.py", line 261, in _prepare_scalar_function
    sf = ScalarFunction(fun, x0, args, grad, hess,
  File "/usr/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 136, in __init__
    self._update_fun()
  File "/usr/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 226, in _update_fun
    self._update_fun_impl()
  File "/usr/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 133, in update_fun
    self.f = fun_wrapped(self.x)
  File "/usr/lib/python3.9/site-packages/scipy/optimize/_differentiable_functions.py", line 130, in fun_wrapped
    return fun(x, *args)
TypeError: energy() takes 1 positional argument but 2 were given
但是,我觉得它不是很优雅,因为我必须使用
pos.energy(pos.x)
而不仅仅是
pos.energy()
来获得职位的能量


有没有更好的方法来定义这个类?

您的第一个代码很好,它不会引发这个错误。请发布完整的错误信息,并进行完整的回溯。最初的标题与我认为你的意图不符。(不,参数的数量与“静态函数”与“实例方法”无关)。如果您想在不改变方向盘的情况下最小化某些内容,请了解
scipy.optimize.minimize(目标函数、初始猜测)
,并希望保留对象。看起来很有挑战性。感谢灰胡子的评论;我尝试了一个更好的标题。“挑战”是指“不可能”吗?
#!/usr/bin/python
from scipy.optimize import minimize

class Position :
    def __init__(self):
        self.x = 1
    
    @staticmethod
    def energy(x) :
        return x**2
    
    def minimize_energy (self):
        sol = minimize(self.energy, x0=self.x)
        self.x = sol.x
        return sol.success
        
pos=Position()
print(pos.x, pos.energy(pos.x))
ss = pos.minimize_energy()
print(ss, pos.x)