0

我想用约束编程语言表达和求解以下方程。

我有变量 t 并试图找到最小化我的目标函数的最佳乘数 k。

时间:t1, t2, t3 ......在输入中给出

倍数 k1, k2, k3...(这是需要找到的连续变量)

c1, c2,.. cN 是常数

主方程k1*sin(c1*x)+k2*sin(c2*x)+k3*sin(c3*x)+k4*cos(c1*x)...

问题是用 (k1, k2, k3..) 的最佳可能值最小化以下所有方程的结果。众所周知,该问题没有确切的解决方案。所以,
当 x 是 t1 --> P1-k1*sin(c1*t1)-k2*sin(c2*t1)-k3*sin(c3*t1)-k4*cos(c1*t1)...

当x 是 t2 --> P2-k1*sin(c1*t2)-k2*sin(c2*t2)-k3*sin(c3*t2)-k4*cos(c1*t2)...

当 x 是 t3 --> P3-k1*sin(c1*t3)-k2*sin(c2*t3)-k3*sin(c3*t3)-k4*cos(c1*t3)...

P1 是时间变量的界值。但是 P(t) 不是解析函数,我只是为它们设置了值,例如当 t1 = 5 P1=0.7 t2= 6 P2= 0.3 等时。

是否有可能在 minizinc 或任何其他 CP 系统中解决这个问题?

4

1 回答 1

2

我不认为 CP 特别适合解决这个问题,因为你在这里并没有真正的限制。你所拥有的只是你想要最小化的函数(f1,..,fi),以及这样做的几个自由度(k1,..,ki)。

我觉得这个问题是最小二乘法的一个很好的候选者。您不是试图将函数f “拟合”到给定值,而是试图最小化它们。因此,您可以尝试将拟合为 0。(因此,我们将处理非线性最小二乘法)。

下面是它希望用 Python 编写的内容:

import numpy as np
from scipy.optimize import curve_fit

xdata = np.array([t1, t2, t3, t4, ..., t10])
ydata = np.zeros(10)  # this is your "target". 10 = Number of ti 

def func(x, k1,k2,...ki):
  return (P(x)-k1*sin(c1*x)-k2*sin(c2*x)-k3*sin(c3*x)-k4*cos(c1*x)...)**2  # The square is a trick to minimize the function 

popt, pcov = curve_fit(func, xdata, ydata, k0=(1.0,1.0,...)) # Initial set of ki
于 2015-05-24T21:24:45.593 回答