Я пишу код для оптимизации для решения проблемы в форме min_x f(x,c)
s.t. sum(x)=1 and g(x,c)=1
, где x
- вектор, а c
- функция от x
, такая, что c(x)
- это константа, когда x
является фиксированным. Действительно, g(x,c)
принимает следующую форму
n=5; N=1000000; idx = 1:1:n; df=4; theta=2; alpha=2.4;
central_Simulation_Points=mvtrnd(eyes(n),df,N);
x=sym('x_%d',[n,1]); syms c
g(x,c)=1./N.*sum((theta.*(alpha-1).*central_Simulation_Points*x).^2+c).^(1./(alpha-1)))==1;
Constraint_equ = solve(g(x,c), c);
Constraint_equ_handle = matlabFunction(Constraint_equ);
Использование solve
для выражения c
в терминах x
, тогда как matlabFunction
заменяет символическую функцию на дескриптор функции для ввода. Затем я определяю целевую функцию obj_fun=@(x)f(x,c(x))
. Целевая функция для оптимизации
(alpha-1)/alpha*sum_{i=1}^N[(theta*(alpha-1)*V(x,Xi)+c)^(1/(alpha-1))*V(x,Xi)]+c/(theta*alpha*(1-alpha))
V(x,Xi)
- любая функция. Я использую (x^{T}Xi)^2
. Си - это i-й ряд central_Simulation_Points
.
Когда я считаю время, Equ = 1./N.*sum((theta.*(alpha-1).*central_Simulation_Points*x).^2+c).^(1./(alpha-1)))==1;
занимает 203 секунды, но кажется, что Constraint_equ = solve(Equ, c);
никогда не останавливает программу. Интересно, можно ли использовать другие методы вместо
?
Constraint_equ = solve(Equ, c);
Constraint_equ_handle = matlabFunction(Constraint_equ);
Есть ли способы найти c
в терминах x
или какие-либо способы изменить код?