посмотрел видео, на которое вы ссылались, и подумал, что вы, возможно, неправильно поняли пару вещей. Я начну с простого примера c, чтобы вы начали.
Если мы возьмем приведенный ниже код:
from scipy.optimize import minimize
def objective(x):
x1=x[0]
x2=x[1]
x3=x[2]
x4=x[3]
return x1+x2+x3+x4
x0=(1,1,1,1)
solution=minimize(objective,x0)
Простая установка. Вы видите, что цель python функция возвращает математическую функцию . Эта математическая функция - это то, что вы минимизируете. Обратите внимание, как все ваши переменные определяются путем вызова значения из списка значений (в данном случае x0). Таким образом, x1 - это x0 [0], x2 - это x0 [1], et c.
В приведенном выше примере вы не определяете x0, и у вас нет уравнения. Наконец, sum - это функция python (она принимает сумму списка). Вместо этого, чтобы сделать то, что вы sh должны делать, давайте перепишем приведенное выше, используя для l oop now:
from scipy.optimize import minimize
import numpy as np
def objective(x):
equation = 0
for i in range(4):
equation += x[i]
return equation
x0=np.ones(4)
solution=minimize(objective,x0)
Это даст вам тот же результат, что и выше; однако теперь вы можете видеть, что я заменил сумму на уравнение (теперь у вас не будет проблем со встроенными функциями python), и теперь вы определили свои переменные). Я не собираюсь go через весь ваш код, но я надеюсь, что этот пример достаточно проясняет, чтобы вы начали.
Если вам нужны 1000-е значения x, просто дайте x0 массив из 1000 значений .
Изменить:
Чтобы решить проблему во 2-й части вашего кода:
Предполагая, что вы исправили, используя сумму. Опять же, ограничения - это указание, в котором вы вводите функцию (математическую). Я не получаю сообщение об ошибке, поэтому не знаю, откуда она взялась. Но вы можете создать функцию ограничения, используя приведенный выше пример.
def constraints(x):
constraint = []
for i in range(4):
value = 0
for j in range(4):
value += 10-j*x[i]
constraint.append(value)
return constraint
x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
sol = minimize(objective, x0, method='slsqp', constraints=con)
Редактировать 2: Вы можете использовать ту же идеологию, указанную выше, для создания второго ограничения:
from scipy.optimize import minimize
import numpy as np
def objective(x):
equation = 0
for i in range(4):
equation += x[i]
return equation
def constraints(x):
constraint = []
for i in range(4):
value = 0
for j in range(4):
value += 10-j*x[i]
constraint.append(value)
return constraint
def constraints2(x):
constraint2 = []
for a in range(4):
value = 0
for b in range(4):
value += 5-a*x[b]
constraint2.append(value)
return constraint2
x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
con2={'type': 'eq', 'fun': constraints2}
combined=[con,con2]
sol = minimize(objective, x0, method='slsqp', constraints=combined)
Это работает без какие-либо проблемы или ошибки, так что я не вижу проблемы, с которой вы столкнулись.