Scipy-fmin-u-powell函数

2024-10-03 21:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用fmin_powell优化函数eul,初始猜测X0(X0=[0.6421,-0.5046])。函数eul得到初始条件,用预测-校正方法计算垂直平板上的速度和温度分布。我在下面显示了我的代码:

def eul(X):
f2, q1 = X
N_tot = 5000;
n=np.linspace(0.0,10.0,N_tot)
f = np.zeros(N_tot,dtype=float).reshape(N_tot,)
dfdn = np.zeros(N_tot,dtype=float).reshape(N_tot,)
d2fdn2 = np.zeros(N_tot,dtype=float).reshape(N_tot,)
q = np.zeros(N_tot,dtype=float).reshape(N_tot,)
dqdn = np.zeros(N_tot,dtype=float).reshape(N_tot,)

Pr = 0.72; #Prandtl Number

##x0 = [d2fdn2_g1, dtdn_g1]
# Boundary Conditions
f[0] = 0.0;
dfdn[0] = 0.0;
d2fdn2[0] = f2;
q[0] = 1.0;
dqdn[0] = q1;
for i in np.arange(0,N_tot-1):
        Dn = n[i+1] - n[i];
        f_tmp=f[i]+dfdn[i]*Dn;
        dfdn_tmp=dfdn[i]+d2fdn2[i]*Dn;
        d2fdn2_tmp=d2fdn2[i]+(-3*f[i]*d2fdn2[i]+2*(dfdn[i])**2-q[i])*Dn;
        q_tmp=q[i]+dqdn[i]*Dn;
        dqdn_tmp=dqdn[i]-3*Pr*f[i]*dqdn[i]*Dn;
        f[i+1]=f[i]+0.5*Dn*(dfdn[i]+dfdn_tmp);
        dfdn[i+1]=dfdn[i]+0.5*Dn*(d2fdn2[i]+d2fdn2_tmp);
        d2fdn2[i+1]=d2fdn2[i]+0.5*Dn*((-3*f[i]*d2fdn2[i]+2*(dfdn[i])**2-q[i])+(-3*f_tmp*d2fdn2_tmp+2*(dfdn_tmp)**2-q_tmp));
        q[i+1]=q[i]+0.5*Dn*(dqdn[i]+dqdn_tmp);
        dqdn[i+1]=dqdn[i]-0.5*Dn*((3*Pr*f[i]*dqdn[i])+(3*Pr*f_tmp*dqdn_tmp));           
        if((q[i+1]>1)|(q[i+1]<0)|(f[i+1]>2)|(f[i+1]<0)):
            q[N_tot-1]=1+1/i;
            dfdn[N_tot-1]=1+1/i;
            break
return dfdn, q, n

主程序

^{pr2}$

我收到一条错误消息:

Traceback (most recent call last):

  File "C:\Users\labuser\Desktop\Sankar\New_Euler.py", line 52, in <module>

     X = scipy.optimize.fmin_powell(eul, X0)

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1519, in fmin_powell

    fval, x, direc1 = _linesearch_powell(func, x, direc1, tol=xtol*100)

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1418, in _linesearch_powell

    alpha_min, fret, iter, num = brent(myfunc, full_output=1, tol=tol)

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1241, in brent
    brent.optimize()

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1113, in optimize

    xa,xb,xc,fa,fb,fc,funcalls = self.get_bracket_info()

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1089, in get_bracket_info

    xa,xb,xc,fa,fb,fc,funcalls = bracket(func, args=args)

  File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1357, in bracket

    if (fa < fb):                      # Switch so fa > fb

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Tags: inpylibnplinescipytmpfile
2条回答

与其向fmin_powell发送数组,不如定义另一个计算返回数组和的函数,然后使用它。在

# Initial Guess
d2fdn2_g1 = 0.6421;
dtdn_g1  = -0.5046;

def eeul(X):
    return np.sum(eul(X))

X0 = np.array([d2fdn2_g1, dtdn_g1])    
X = scipy.optimize.fmin_powell(eeul, X0)

这似乎很管用。在

我猜您的函数eul正在返回一个数组。fmin_powell最小化标量函数。检查eul是否返回单个值,而不是数组。在

(在没有看到更多代码的情况下,我们只能猜测。如果您将eul的定义添加到问题中,会有所帮助。)

相关问题 更多 >