gre*_*ory 5 python optimization class scipy
我正在使用 python 来解决优化问题。我想定义一个类来完成这项工作。在类中,我想使用模型函数作为类的方法,例如:
class MyClass(object):
def f(self,x,parameters):
Run Code Online (Sandbox Code Playgroud)
但我还想在同一个类中定义另一个方法来对 x 上的函数 f 进行优化,例如:
def Optim_Funtion(self):
scipy.optimize.minimize(f,x0,'method='Nelder-Mead')
Run Code Online (Sandbox Code Playgroud)
我的问题是如何做到这一点?我是否必须在 Optim_Funtion 方法中将函数 f 作为 self.f 传递?我发现了一个与此相关的问题,但他们从类定义中取出了优化问题: 类方法作为 scipy.optimize.curve_fit 的模型函数 ,这不是我想要做的。
这里是我使用的代码:
class LaserGating:
# Given laser pulse energy and min photon number to be received at a detector, calculate the max distance
def __init__(self, alpha, PhotonNumber, EnergyMin, EnergyMax, Wavelength,TargetReflection,d):
self.alpha = alpha
self.PhotonNumber = PhotonNumber # photon number @detector
self.EnergyMax = EnergyMax # laser pulse energy max
self.EnergyMin = EnergyMin # laser pulse energy Min
self.Wavelength = Wavelength # laser wavelengh
self.TargetReflection = TargetReflection # target reflection
self.d = d # detector size
self.PhotonEnergy = 1.054e-34*2*np.pi*3.e8/self.Wavelength # energy of a photon at wavelength "Wavelength"
self.PulseEnergy = self.EnergyMin
self.PulseEnergyRange = np.linspace(self.EnergyMin,self.EnergyMax,1000) # array of energy pulse values
return
def fMin(self,x,PulseEnergy):
# laser range model: x is the argument (distance) that the function is to be minimized on
f = self.PhotonNumber - PulseEnergy*self.TargetReflection * ((self.d/x)**2)*np.exp(-self.alpha*x)/self.PhotonEnergy
return f
def FindDistance(self):
#find maximale distance given energy and photon number@ detector
#print self.PulseEnergyRange
rangeEnergy = self.PulseEnergyRange
#print rangeEnergy
testrange = []
#for testeleements in rangeEnergy:
#print testeleements
for elements in rangeEnergy:
#initial guess. Fixed for the moment but should depend on elements
x0 = 10.
#print elements
# optimisation on x, using elements as arg
test = scp.optimize.newton(self.fMin,x0,args = (elements,),tol= 1e-3)
# append answer
testrange.append(test)
return testrange
Run Code Online (Sandbox Code Playgroud)
当我运行它时,例如使用:
DistanceRange = LaserGating(0.001,1000,1.e-9,1.e-6,532.e-9,0.2,0.001)
DistanceRange.FindDistance()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
enter ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-199-597c7ff1bb69> in <module>()
----> 1 DistanceRange.FindDistance()
<ipython-input-194-b1c115d544c0> in FindDistance(self)
32 x0 = 1000.
33
---> 34 test = scp.optimize.minimize(self.fMin,x0,args = (elements),method='Nelder-Mead',tol= 1e-2)
35 testrange.append(test)
36 print elements
C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site- packages\scipy\optimize\_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
411 callback=callback, **options)
412 elif meth == 'nelder-mead':
--> 413 return _minimize_neldermead(fun, x0, args, callback, **options)
414 elif meth == 'powell':
415 return _minimize_powell(fun, x0, args, callback, **options)
C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site- packages\scipy\optimize\optimize.pyc in _minimize_neldermead(func, x0, args, callback, xtol, ftol, maxiter, maxfev, disp, return_all, **unknown_options)
436 if retall:
437 allvecs = [sim[0]]
--> 438 fsim[0] = func(x0)
439 nonzdelt = 0.05
440 zdelt = 0.00025
C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site- packages\scipy\optimize\optimize.pyc in function_wrapper(*wrapper_args)
279 def function_wrapper(*wrapper_args):
280 ncalls[0] += 1
--> 281 return function(*(wrapper_args + args))
282
283 return ncalls, function_wrapper
TypeError: fMin() takes exactly 3 arguments (2 given)code here
Run Code Online (Sandbox Code Playgroud)
所以问题在于调用方法时无法识别的附加参数。
在此先感谢您的任何建议,
格雷戈里
传递args = (elements)相当于args = elements,即不创建元组。
要传递 1 元素元组,请执行args = (elements,), 或args = tuple([elements])。
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |