我有一个由21个多项式方程组成的系统,共有12个未知数a, ..., l
。每个等式都具有一般形式V1*abc + V2*abd + ... + V64*jkl = x
,其中V1, ..., V64
各自为0或1,即每个等式在左侧包含三个不同产品的总和未知数。
有一组约束:a + b + c + d = 1
,e + f + g + h = 1
,i + j + k + l = 1
。所有x
s(右侧)的总和等于1.
我输入x
s的向量作为输入。是否有一个求解器可以为a, ..., l
提供x'
的值,它在遵守约束的同时产生尽可能接近原始x
的{{1}} s的向量?我正在寻找一个python实现。
我查看scipy.optimize
,但我无法确定哪种方法更适合我的问题。
答案 0 :(得分:0)
您可能想尝试this python binding for IPOPT。 IPOPT是一个优化库,它使用内点求解器来查找具有广义约束(等式和不等式约束)的函数的最优(局部)最优。正如您所描述的那样,您不会关心不等式约束。
优化目标的候选函数将是21个多项式方程的平方差的总和。假设你从你的初始x开始,这是一个21元素的向量,然后你的目标是:
(V1_0 * abc + V2_0 * abd + ... + V64_0 * jkl - x_0)^ 2 +(V1_1 * abc + V2_1 * abd + ... + V64_1 * jkl - x_1)^ 2 + ... (V1_ {21} * abc + V2_ {21} * abd + ... + V64_ {21} * jkl - x_ {21})^ 2
要使用IPOPT,您需要计算约束和目标的偏导数以及所有变量a-l。
如果IPOPT不适合您,您甚至可以将scipy.optimize与此目标函数一起使用。从文档来看,它看起来像scipy.optimize将根据你如何定义它来尝试选择适合你的问题的方法;如果你正确定义你的约束和目标,scipy.optimize应该选择正确的方法。