【问题标题】:Minimize function with many parameters具有许多参数的最小化函数
【发布时间】:2018-01-01 15:30:48
【问题描述】:

我想最小化一个函数以获得一些参数的值:a,e,I,Omega,om,tp。

我使用这个“模块”:docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html。

我的函数有13个参数:

我导入了:from scipy.optimize import minimize。然后我尝试最小化它。并且发生错误:

有人能帮忙解决这个问题吗?

PS:我一周前开始使用python,可能可以解释程序的这种语法,但是我愿意改进自己。

from numpy import *
import numpy as np
import scipy as sp
from scipy.optimize import minimize
import matplotlib.pyplot as plt
from pylab import *
from os import chdir
chdir("/Users/benjaminjaillant/Desktop")

def Chi_VLT(a,e,I,tp,Omega,om,Mbh,R0,Vr_bh,alpha_bh,V_alp_bh,delta_bh,V_del_bh):
    return sum(((Vr_etoile(t_vr_VLT*365*24*3600,a,e,I,tp,om,Mbh,Vr_bh)/1000)-vr_VLT)**2/vr_error_VLT**2) + sum(((alpha_etoile_IR(t_orbit_VLT*365*24*3600,a,e,I,tp,Omega,om,Mbh,alpha_bh,V_alp_bh,R0)*206264806.246)-Ra_VLT)**2/Ra_error_VLT**2) + sum(((delta_etoile_IR(t_orbit_VLT*365*24*3600,a,e,I,tp,Omega,om,Mbh,delta_bh,V_del_bh,R0)*206264806.246)-Dec_VLT)**2/Dec_error_VLT**2)


x0 = [1.5e14,0.8,2.5,63.10e9,4,1,8.5e36,2.5e20,2000,1.3e-8,-10e-18,2e-9,1.5e-17]

res = minimize(Chi_VLT, x0 , method='nelder-mead',options={'xtol': 1e-4,'maxiter':50 ,'disp': True})

print res.message
print res.x

【问题讨论】:

  • 大家好:),我不知道如何编辑我的帖子..
  • Î 就在这里,在标签下面,请贴出你的函数代码,而不是图片
  • 所有代码??读起来不会太复杂吧?
  • 我们这里只需要相关且可重现的部分
  • 从外观上看,优化器正在尝试使用单个参数 x0(列表...)而不是其内容来调用函数。您可以先尝试将 x0 转换为所需类型的 nd 数组。

标签: python variables optimization minimize


【解决方案1】:

最小化例程需要一个 ndarray,比如 guess,作为初始函数参数,并接受一个额外的参数元组 x0,它可能构成成本函数中的系数。如果您重写 CHI_VLT 以将第一个 arg 和 ndarray 作为第一个参数,然后将剩余的参数作为相应的参数,它应该可以工作。

res = minimize(CHI_VLT, guess, args=x0,...)

【讨论】:

  • 谢谢伙计,我试过了,但现在问题出在这里:TypeError:minimize() 最多接受 12 个参数(给定 16 个)我只是不明白 python 是如何工作的......!
【解决方案2】:

我猜你在这里搞砸了。

您的函数scipy.optimize.minimize 需要两个必需的位置参数, funx0

你需要 ndarrayx0

在您的情况下,您的乐趣 Chi_VLT 需要 13 个参数,您需要使用 args=(tuple, containing, 13, items) 传递它

只有你才能最大限度地减少你的乐趣。

【讨论】:

  • 谢谢,你的意思是我必须写:minimize(Chi_VLT, x0, args=(a,e,I...(13paramters)) , method='nelder-mead') ?跨度>
  • 是的。 x0 没问题。它可以是列表,就像你拥有的一样。
  • 我写道:x0 = (1.5e14,0.8,2.5,63.10e9,4,1,8.5e36,2.5e20,2000,1.3e-8,-10e-18,2e-9, 1.5e-17) res = minimum(Chi_VLT, x0 , args=(a,e,I,tp,Omega,om,Mbh,R0,Vr_bh,alpha_bh,V_alp_bh,delta_bh,V_del_bh) ,method='nelder-mead' ,options={'xtol': 1e-4,'maxiter':50 ,'disp': True}) 还是不行,根据程序"a","e"..没有定义跨度>
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多