Оптимизация с программированием ограничений
Я хочу выразить и решить приведенные ниже уравнения на языке программирования ограничений.
У меня есть переменные t и я пытаюсь найти лучшие множители k, которые минимизируют мою целевую функцию.
Время: t1, t2, t3... задано на входе
Multipler 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 и т. Д.
Можно ли решить эту проблему в миницинке или любой другой системе CP?
1 ответ
Я не думаю, что CP особенно подходит для решения этой проблемы, поскольку у вас нет никаких ограничений. Все, что у вас есть, - это функции, которые вы хотите минимизировать (f1,.., fi), и несколько степеней свободы для этого (k1,.., ki).
Я чувствую, что проблема - довольно хороший кандидат на метод наименьших квадратов. Вместо того, чтобы пытаться "подогнать" ваши функции f к заданному значению, вы пытаетесь минимизировать их. Итак, что вы можете сделать, это попытаться подогнать 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