Python 带scipy的非线性约束

Python 带scipy的非线性约束,python,python-3.x,scipy,nonlinear-optimization,Python,Python 3.x,Scipy,Nonlinear Optimization,目前的问题是具有非线性约束的多元函数的优化。 有一个微分方程(其形式过于简单) 我需要最小化DEy(x)的解,但是通过改变t(x)。 由于它是引擎盖下的物理,因此对t(x)有一些限制。我成功地实现了所有这些功能,除了一个: 0 < t(x) < 1 for any x in range [a,b] 浮动的x是固定的numpy.ndarray,对系数a进行优化。我使用withtrust constr。 到目前为止,我所尝试的: 在每个步骤中查找根,并使用和检查符号更改来确定函数的最小

目前的问题是具有非线性约束的多元函数的优化。 有一个微分方程(其形式过于简单)

我需要最小化DE
y(x)
的解,但是通过改变
t(x)
。 由于它是引擎盖下的物理,因此对
t(x)
有一些限制。我成功地实现了所有这些功能,除了一个:

0 < t(x) < 1 for any x in range [a,b]
浮动的
x
是固定的
numpy.ndarray
,对系数
a
进行优化。我使用with
trust constr

到目前为止,我所尝试的:

  • 在每个步骤中查找根,并使用和检查符号更改来确定函数的最小值/最大值。如果满足约束,则返回0.5;如果不满足约束,则返回-1或不在[0;1]范围内的任何值。优化器很快停止,函数未正确最小化
  • 由于
    x
    是固定长度且已知的,因此我尝试为每个点定义一个约束,因此得到了N个约束,其中
    N=len(x)
    。这是可行的(至少看起来是这样),但对于不太大的N来说需要永远。此外,由于
    x
    是离散的和非均匀的,我不能确定[a,b]中的任何x都没有违反约束
  • 编辑#1:最小可复制示例

    import scipy.optimize as optimize
    from scipy.optimize import Bounds
    import numpy as np
    
    # some function y(x)
    x = np.linspace(-np.pi,np.pi,100)
    y = np.sin(x)
    
    # polynomial t(z)
    def t(a,z):
        v = 0.0;
        for ii in range(len(a)):
            v += a[ii]*z**ii
        return v
    
    # let's minimize the sum
    def targetFn(a):
        return np.sum(y*t(a,x))
    
    # polynomial order
    polyord = 3
    
    # simple bounds to have reliable results, 
    # otherwise the solution will grow toward  +-infinity
    bnd = 10.0
    bounds = Bounds([-bnd for i in range(polyord+1)],
                    [bnd for i in range(polyord+1)])
    
    res = optimize.minimize(targetFn, [1.0 for i in range(polyord+1)], 
                            bounds = bounds)
    
    if np.max(t(res.x,x))>200:
        print('max constraint violated!')
    if np.min(t(res.x,x))<-100:
        print('min constraint violated!')
    
    导入scipy.optimize作为优化
    从scipy.optimize导入边界
    将numpy作为np导入
    #某些函数y(x)
    x=np.linspace(-np.pi,np.pi,100)
    y=np.sin(x)
    #多项式t(z)
    定义t(a,z):
    v=0.0;
    对于范围内的ii(len(a)):
    v+=a[ii]*z**ii
    返回v
    #让我们最小化总和
    def目标fn(a):
    返回np.和(y*t(a,x))
    #多项式阶
    普立沃德=3
    #有可靠结果的简单界限,
    #否则,解将向+-无穷大方向增长
    bnd=10.0
    界限=界限([-bnd表示范围内的i(polyord+1)],
    [bnd代表范围内的i(普立万+1)])
    res=优化。最小化(targetFn,[1.0表示范围内的i(普立万+1)],
    边界=边界)
    如果np.max(t(res.x,x))>200:
    打印('违反了最大约束!')
    如果np.min(t(res.x,x))
    
    t(x) = a0 + a1*x + a2*x**2 + a3*x**3 + a4*x**4 + a5*x**5
    
    import scipy.optimize as optimize
    from scipy.optimize import Bounds
    import numpy as np
    
    # some function y(x)
    x = np.linspace(-np.pi,np.pi,100)
    y = np.sin(x)
    
    # polynomial t(z)
    def t(a,z):
        v = 0.0;
        for ii in range(len(a)):
            v += a[ii]*z**ii
        return v
    
    # let's minimize the sum
    def targetFn(a):
        return np.sum(y*t(a,x))
    
    # polynomial order
    polyord = 3
    
    # simple bounds to have reliable results, 
    # otherwise the solution will grow toward  +-infinity
    bnd = 10.0
    bounds = Bounds([-bnd for i in range(polyord+1)],
                    [bnd for i in range(polyord+1)])
    
    res = optimize.minimize(targetFn, [1.0 for i in range(polyord+1)], 
                            bounds = bounds)
    
    if np.max(t(res.x,x))>200:
        print('max constraint violated!')
    if np.min(t(res.x,x))<-100:
        print('min constraint violated!')