【发布时间】:2019-11-15 00:05:37
【问题描述】:
在我的例子中,我们只取3 自然数,即1,2, 3。
与这些自然数相关的集合是M1、M2 和M3。我选择了 Matlab fmincon 提供的求解器,而不是 II(2) 中的牛顿法。
这是我的代码不起作用!
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) 的最小值,满足 S 中所有 s 的所有约束 g(x,s)
我的算法是做什么的,首先它需要 S 的一些有限子集并计算这个集合上 f 的最小值,然后我试图用一些 s_new 更新 S。我试图实现的这个算法正是创建 s_new 的过程。然后,如果它工作正常,我会将 s_new 添加到我的子集并计算新集上的最小值,依此类推,直到 g(x,s)
【问题讨论】:
-
我建议用您考虑的任何值简单地初始化
s_new,因为似乎不满足创建它的任何条件。 -
另外我建议使用
return而不是布尔变量。 -
我认为代码一定有问题,不可能有几个不同的 x 点不符合标准。
-
fmincon仅优化s,将g_new更改为g_new = @(s) -g(x,s) -
我给你重写算法,
max是g的最大值,不是预定义的随机数
标签: matlab for-loop optimization