Оптимизация с программированием ограничений

Я хочу выразить и решить приведенные ниже уравнения на языке программирования ограничений.

У меня есть переменные 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 к заданному значению, вы пытаетесь минимизировать их. Итак, что вы можете сделать, это попытаться подогнать к 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
Другие вопросы по тегам