Python 带scipy的非线性约束
目前的问题是具有非线性约束的多元函数的优化。 有一个微分方程(其形式过于简单) 我需要最小化DEPython 带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。 到目前为止,我所尝试的: 在每个步骤中查找根,并使用和检查符号更改来确定函数的最小
y(x)
的解,但是通过改变t(x)
。
由于它是引擎盖下的物理,因此对t(x)
有一些限制。我成功地实现了所有这些功能,除了一个:
0 < t(x) < 1 for any x in range [a,b]
浮动的x
是固定的numpy.ndarray
,对系数a
进行优化。我使用withtrust constr
。
到目前为止,我所尝试的:
x
是固定长度且已知的,因此我尝试为每个点定义一个约束,因此得到了N个约束,其中N=len(x)
。这是可行的(至少看起来是这样),但对于不太大的N来说需要永远。此外,由于x
是离散的和非均匀的,我不能确定[a,b]中的任何x都没有违反约束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!')