我经常要解决非线性问题,其中变量的数量超过了约束的数量(或者有时反过来).通常,一些约束或变量以复杂的方式冗余.有什么方法可以解决这些问题吗?
大多数scipy求解器似乎假设约束的数量等于变量的数量,并且Jacobian是非奇异的. leastsq有时可以工作但是当约束少于变量数时它甚至都没有尝试.我意识到,我可以只运行fmin在linalg.norm(F),但这是效率远远低于它利用雅可比的任何方法.
这是一个问题的例子,它说明了我在说什么.它显然有一个解决方案,但leastsq给出了一个错误.当然,这个例子很容易手工解决,我只是把它放在这里来证明这个问题.
import numpy as np
import scipy.optimize
mat = np.random.randn(5, 7)
def F(x):
y = np.dot(mat, x)
return np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17 ])
x0 = np.random.randn(7)
scipy.optimize.leastsq(F, x0)
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是:
Traceback (most recent call last):
File "question.py", line 13, in <module>
scipy.optimize.leastsq(F, x0)
File "/home/dstahlke/apps/scipy/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 278, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m))
TypeError: Improper input: N=7 must not exceed …Run Code Online (Sandbox Code Playgroud) c ++中是否有任何好的库用于带约束的顺序非线性优化?
我正在寻找不等式约束和/或上限和下限.
已经有一个stackoverflow问题,但并非所有问题都有约束.
我知道NLopt,但它对我的具体问题不起作用.还有其他人吗?
要解决的问题是找到浮体的浮动状态,考虑其重量和重心.
我使用的功能计算给定下沉,鞋跟和修剪的身体的移位体积和中心.下沉是长度单位,后跟/修剪的角度限制在-90到90之间.

当移位的体积等于重量并且重心处于具有中心的垂直线时发现浮动状态.
我将此实现为具有3个变量(下沉,修剪,后跟)和3个方程的非线性Newton-Raphson根发现问题.这种方法有效,但需要良好的初步猜测.所以我希望找到一个更好的方法,或者找到初始值的好方法.
下面是用于Newton-Raphson迭代的牛顿和雅可比算法的代码.功能体积采用参数下沉,鞋跟和修剪.并返回体积,以及bouyancy中心的坐标.
我还包括了maxabs和GSolve2算法,我相信这些算法来自Numerical Recipies.
void jacobian(float x[], float weight, float vcg, float tcg, float lcg, float jac[][3], float f0[]) {
float h = 0.0001f;
float temp;
float j_volume, j_vcb, j_lcb, j_tcb;
float f1[3];
volume(x[0], x[1], x[2], j_volume, j_lcb, j_vcb, j_tcb);
f0[0] = j_volume-weight;
f0[1] = j_tcb-tcg;
f0[2] = j_lcb-lcg;
for (int i=0;i<3;i++) {
temp = x[i];
x[i] = temp + h;
volume(x[0], x[1], x[2], j_volume, j_lcb, j_vcb, j_tcb);
f1[0] = j_volume-weight;
f1[1] = j_tcb-tcg;
f1[2] = j_lcb-lcg; …Run Code Online (Sandbox Code Playgroud) c++ algorithm math mathematical-optimization nonlinear-optimization
因此,我在R中遇到了这个奇怪的错误。我有一个简单的函数,当比较实际价格和模拟价格时会返回错误项hestondifferences()。
当我尝试通过以下方式找到本地最小值时:
res<-optim(fn=hestondifferences, par = c(vT=vT, rho=rho, k=k, sigma=sigma))
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
optim中的误差(fn = hestondifferences,par = c(vT = vT,rho = rho,k = k,:无法在初始参数处评估函数
令我感到困惑的是,直接使用初始参数调用该函数会hestondifferences(vT, rho, k, sigma)返回正确的值。
该函数hestondifferences()以某种方式编写:只要无法对某些参数集进行仿真,它将返回NA与optim()期望相符的结果。
我正在尝试用Apache Commons提供的java优化库来解决受约束的非线性267维优化问题.
经过3天的破译,这就是我所拥有的:
public class optimize2 {
public static void main(String []args){
double[] point = {1.,2.};
double[] cost = {3., 2.};
MultivariateFunction function = new MultivariateFunction() {
public double value(double[] point) {
double x = point[0];
double y = point[1];
return x * y;
}
};
MultivariateOptimizer optimize = new BOBYQAOptimizer(5);
optimize.optimize(
new MaxEval(200),
GoalType.MAXIMIZE,
new InitialGuess(point),
new ObjectiveFunction(function),
new LinearConstraint(cost, Relationship.EQ, 30));
}
Run Code Online (Sandbox Code Playgroud)
}
无论出于何种原因,optimize.optimize()都会抛出空指针错误.也许我只是愚蠢但我无法弄清楚如何使这个工作.
这是错误:
异常线程 "main" 显示java.lang.NullPointerException在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.setup(BOBYQAOptimizer.java:2401)在org.apache.commons.math3.optim.nonlinear .scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:236)在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:49)在org.apache.commons.math3 .optim.BaseOptimizer.optimize(BaseOptimizer.java:143)在org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:66)在org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer .optimize(MultivariateOptimizer.java:64)在Test.Code.optimize2.main(optimize2.java:39)
java optimization multidimensional-array nonlinear-optimization
是否可以nloptr在R 中的函数中指定多个相等约束?我尝试运行的代码如下:
eval_f <- function( x ) {
return( list( "objective" = x[3]^2+x[4]^2,
"gradient" = c( 0,
0,
2*x[3],
2*x[4] ) ) )
}
# constraint functions
# equalities
eval_g_eq <- function( x ) {
constr <- c( x[1] + x[2] + x[3] - 4,
x[1]^2 + x[2]^2 + x[4] - 15
)
grad <- c( c(1, 1, 1, 0),
c(2*x[1], 2*x[2], 0, 1)
)
return( list( "constraints"=constr, "jacobian"=grad ) )
}
# initial values
x0 <- c( …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用GEKKO优化指数目标函数,但是我不知道所选的求解器是否是解决此类问题的最佳方法。
被选择的一个是有效的选择吗?
import numpy as np
'GEKKO MODELING'
from gekko import GEKKO
m = GEKKO()
m.options.SOLVER=1 # APOPT is an MINLP solver
# Initialize variables
x = []
x1 = m.Var(value=20,lb=20, ub=6555) #integer=True
x2 = m.Var(value=0,lb=0,ub=10000) #integer=True
x3 = m.sos1([30, 42, 45, 55])
x = [x1, x2, x3]
# Equations
m.Equation((x1 * x2* x3) * 10 ** (-6)>=50)
def fun(x):
return 44440 + ((np.pi * x[0] * x[1] * x[2]) * 10 ** (-4))**0.613
x = [400,300,19]
'GEKKO Optimization'
m.Obj(fun(x)) …Run Code Online (Sandbox Code Playgroud) python optimization nonlinear-optimization exponential gekko
我正在写我的硕士论文,我在R代码中遇到了这个问题.在数学上,我想用R-package"nleqslv"来解决这个非线性方程组:
fnewton <- function(x){
y <- numeric(2)
d1 = (log(x[1]/D1)+(R+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 = d1-x[2]*sqrt(T)
y1 <- SO1 - (x[1]*pnorm(d1) - exp(-R*T)*D1*pnorm(d2))
y2 <- sigmaS*SO1 - pnorm(d1)*x[2]*x[1]
y}
xstart <- c(21623379, 0.526177094846878)
nleqslv(xstart, fnewton, control=list(btol=.01), method="Newton")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个代码的几个版本,现在我收到错误:
error: error in pnorm(q, mean, sd, lower.tail, log.p): not numerical.
Pnorm分别是d1和d2的累积标准正态分布.我真的不知道,当我在Teterevas幻灯片上定位我的模型时我做错了什么(在5号幻灯片上是她的模型代码),谁的演示是googeling的第一个结果
与我一样,无论多么成功,她都会通过Black-Scholes-Merton方法计算违约距离风险度量.在这个模型中,权益的价值(通常由市值表示, - > SO1)可以写成欧洲看涨期权 - 我在上面的代码中标记为y2,但是,之前的等式设置为0!
其他变量是:
x [1] - >我想要得到的变量,总资产的价值
x [2] - >我想得出的变量,总资产的波动性
D1 - >债务账面价值(1998-2009)
R - >无风险利率
T - >设置为1(时间)
sigmaS - >估计(历史)股票波动率
谢谢!我很高兴,任何人都可以帮助我.卡罗
试图用一个变量解决一个简单的非线性最小化问题.
from scipy.optimize import minimize
import math
alpha = 0.05
waiting = 50
mean_period = 50
neighborhood_size = 5
def my_func(w):
return -(2/(w+1) + alpha*math.floor(waiting/mean_period))*(1-(2/(w+1) + alpha*math.floor(waiting/mean_period)))**(neighborhood_size-1)
print minimize(my_func, mean_period, bounds=(2,200))
Run Code Online (Sandbox Code Playgroud)
这给了我
ValueError: length of x0 != length of bounds
Run Code Online (Sandbox Code Playgroud)
我输错了吗?我该如何格式化?
如果我删除边界,我得到:
status: 2
success: False
njev: 19
nfev: 69
hess_inv: array([[1]])
fun: array([-0.04072531])
x: array([50])
message: 'Desired error not necessarily achieved due to precision loss.'
jac: array([-1386838.30676792])
Run Code Online (Sandbox Code Playgroud)
该函数看起来像这样,因此我需要界限来限制我感兴趣的局部最大值的解决方案.
python optimization minimization scipy nonlinear-optimization
是否可以在 python 上使用 pymoo运行3 个目标、16 个约束、12 个变量问题,如果有其他程序可以提供帮助,请告知?我已经使用了 pymoo 代码,它一直提供此错误。
File "C:\Users\omar.elfarouk\Anaconda3\lib\sitepackages\pymoo\model\problem.py", line 286, in evaluate
CV = Problem.calc_constraint_violation(out["G"])
KeyError: 'G'
Run Code Online (Sandbox Code Playgroud)
代码如下
```#from pyomo.environ import *
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_problem
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
from pymoo.factory import get_termination
from pymoo.util import plotting
import autograd.numpy as anp
import numpy as np
from pymoo.util.misc import stack
from pymoo.model.problem import Problem
import numpy as np
import math```
Run Code Online (Sandbox Code Playgroud)
```#Factors for the third …Run Code Online (Sandbox Code Playgroud) optimization ×4
python ×4
r ×3
c++ ×2
scipy ×2
algorithm ×1
constraints ×1
equality ×1
exponential ×1
gekko ×1
java ×1
math ×1
minimization ×1
nlm ×1
nlopt ×1