Я пытаюсь реализовать этот алгоритм для нахождения нового ограничения:
В моем случае мы берем только 3
натуральных чисел, т.е. 1,2, 3
.Наборы, связанные с этими натуральными числами: M1
, M2
и M3
.Вместо метода Ньютона в II(2)
я выбрал решатель, предоставленный Matlab fmincon
.Вот мой код, который не работает!
function[s_new]= checking2(M1,M2,M3,x)
M1=linspace(0,1,10)';
M2=linspace(0,1,100)';
M3=linspace(0,1,1000)';
bool1=0;
eta = 10^-8;
pocz=[];
max=-100;
x = [0.1,0.1]'; % warunek początkowy
A = [];
b = [];
Aeq = [];
beq = [];
Set=[0,1];
g = @(x,s) 5*x(1).^2.*sin(pi.*sqrt(s))./(1+s.^2) - x(2);
g_new = @(s) -g(x,s);
for i=1:length(M1)
if g(x,M1(i,:))>eta
s_new=M1(i,:);
bool1=1;
end
end
if ~bool1
for i=1:length(M1)
if g(x,M1(i,:))>max
pocz=M1(i,:);
max=g(x,M1(i,:));
end
end
if max<-eta
bool1=1;
end
end
if ~bool1
s_maybe = fmincon(g_new,pocz,A,b,Aeq,beq,min(Set),max(Set));
if g(x,s_maybe)>eta
s_new=s_maybe;
bool1=1;
end
end
if ~bool1
for i=1:length(M2)
if g(x,M2(i,:))>eta
s_new=M2(i,:);
bool1=1;
end
end
end
if ~bool1
for i=1:length(M2)
if g(x,M2(i,:))>max
pocz=M2(i,:);
max=g(x,M2(i,:));
end
end
if max<-eta
bool1=1;
end
end
if ~bool1
s_maybe = fmincon(g_new,pocz,A,b,Aeq,beq,min(Set),max(Set));
if g(x,s_maybe)>eta
s_new=s_maybe;
bool1=1;
end
end
if ~bool1
for i=1:length(M3)
if g(x,M3(i,:))>eta
s_new=M3(i,:);
bool1=1;
end
end
end
if ~bool1
s_new = 1;
end
disp(s_new);
Проблема в следующем:
Undefined function or variable 's_new'.
Error in checking2 (line 70)
disp(s_new);
Так что в принципе все может быть не так, но я полагаю, что-то с fmincon.
РЕДАКТИРОВАТЬ:
Цель алгоритма - найти минимум целевой функции f (x), удовлетворяющий всем ограничениям g (x, s) <= 0 для всех s в S, где S - бесконечное множество (некоторый интервал внаш случай). </p>
Что делает мой алгоритм, сначала он берет некоторое конечное подмножество S и вычисляет минимум f на этом множестве, затем я пытаюсь обновить S некоторым s_new.Этот алгоритм, который я пытаюсь реализовать, является именно процедурой создания s_new.Затем, если он работает должным образом, я добавлю s_new в мое подмножество и вычислю минимум на новом наборе и так далее, пока g (x, s) <= eta, где eta - небольшое число. </p>