Python和Scipy优化实现

2024-10-01 00:22:26 发布

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

我写了一段代码,我需要一些关于实现optimization方法的帮助,也许是用scipy。 如果您可以注意到下面我有一个变量“pD”,我需要改变它,以便找到“abs(mFmin[I][j]-mReg[I][j])>;1”的结果。mFmin,mReg和所有其他计算都依赖于“pD”

我写了一个很差的代码,只是为了测试,为了改变mFmin和mReg的“pD”,但是它太慢了,不管我是否提出错误,这些小代码很糟糕。在

我正在scipy库中搜索一些optimization代码,但我看不出在哪里可以用我的代码来实现这一点。我认为解决问题很简单,但我没有人可以交换意见。。。在

注:pD是一个矩阵

下面,我附上了代码的主要部分:

for i in range(0,int(x)):
    for j in range(0,n):
        curso[i] = i*passo
        curso[0] = 0
        pD[i][j] = pZref
        mFmin[i][j] = 0
        mReg[i][j] = gref

# my doubt starts here
        while abs(mFmin[i][j] - mReg[i][j]) > 1:
            if mFmin[i][j] < mReg[i][j]:
                pD[i][j] = pD[i][j] + 0.0001
            else:
                pD[i][j] = pD[i][j] - 0.0001

            pZaux[i][j] = pE_*sqrt((pow(pZref/pE_,2)-pow(pA/pE_,2))*pow(mFmin[i][j]/gref,2)+pow(pA/pE_,2))

            vD[i][j] = pE_*vE_/pD[i][j]
            if pD[i][j]/pE_ > RPcr:
                psiR[i][j] = sqrt(pow(pD[i][j]/pE_,2/kappa)-pow(pD[i][j]/pE_,(kappa+1)/kappa))
            else:
                psiR[i][j] = psicrR
            if pZaux[i][j]/pD[i][j] > RPcr:
                psiF[i][j] = sqrt((2*kappa/(kappa-1))*(pow(pZaux[i][j]/pD[i][j],2/kappa)-pow(pZaux[i][j]/pD[i][j],(kappa+1)/kappa)))
            else:
                psiF[i][j] = psicrF

            mFmin[i][j] = 3600*psiF[i][j]*kmin*(fmin[j]/1000000)*sqrt(pD[i][j]*100000/vD[i][j])
            mReg[i][j] = 3600*psiR[i][j]*alpha*(fV[i][j]/1000000)*sqrt(2*kappa/(kappa-1)*(pE_*100000/vE_))

谢谢你的阅读!在

MRM公司


Tags: 代码ifscipysqrtelsepdpekappa
3条回答

您可以看看优化包:http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

作为一个简单的例子,假设您正在寻找(x-3)**2的最小值。定义一个函数,该函数获取输入并返回函数值。您传递这个函数来最小化,以及一个初始猜测x0。在

import numpy as np
from scipy.optimize import minimize
def fn(x):
    return (3-x)**2
x0 = 0
res = minimize(fn, x0, method='nelder-mead', options={ 'disp': True})

这将按预期返回3.0。可以将fn定义为有一个输入向量x,然后将x0指定为一个向量,即初始点的维数与fn期望的相同。在

在本例中,“nelder-mead”方法是一个简单的算法,可能运行时间较长。如果你知道广度函数或你的函数要最小化,你可以使用更高级的算法,例如BFGS,并传递梯度函数,如doc中所述。在

我建议导入numpy:

import numpy as np

因为它看起来不是来自于你的模块,而是来自于你的模块。这可能是错误的原因。见TypeError: only length-1 arrays can be converted to Python scalars while trying to exponentially fit data

还有一些建议:

  • 不需要在切片范围中指定0:psiR[0:,0:]==psiR[:,:]==psiR
  • 如果pZref是标量,则使用x0 = np.ones(n) * pZref创建{}。在
  • 你应该读一些numpy手册来熟悉这些构造。在

Andrey Sobolev建议使用numpy,因为if-pD是一个numpy数组,您将以pD[i,j]而不是{}的形式访问它的元素,这样更快、更简单。在

如果我做对了,每个[I,j]优化都是独立于数组中其他值的,对吧?然后,你只需执行i*j优化(如果结果是耦合的,事情会变得更复杂…)

这个问题可能太慢,有两个原因。因为优化速度慢,或者因为i和j非常大。在后一种情况下,您可能可以使用Numba来加速它,因为在Python中for循环很慢。在

如前所述,使用scipy.optimize中的某个方法来执行每个优化。注意最初的猜测,特别是如果函数有多个最小值。在

相关问题 更多 >