我正在尝试在matlab中实现以下函数,其中除“ o”以外的所有变量都是已知的。然后,在定义函数后,使用lsqnonlin方法基于初始猜测找到最小值。
Matlab代码:
%%
x0 = 23;
[x,resnorm] = lsqnonlin(@myfun,x0);
%%
function F = myfun(x)
k = 1:5;
p = 1:5;
F = max_index_values_5(k,p)-(sqrt(a(k)-b(p))+x);
end
其中max_index_values是5 * 5矩阵,而a和b是长度为5的向量,而u * v则为零,这就是为什么不在Matlab代码中的原因。当我运行代码时,出现以下错误:
类型为输入参数的未定义函数'max_index_values_5' “双”。
有人可以帮我实现该功能,以便与lsqnonlin一起使用吗?
答案 0 :(得分:0)
这里是使用两个不同求解器的示例(起初,我无权访问Optimization Toolbox
并使用了可用的fminsearch
)
function [] = main()
z = [1 2 3;
4 5 6;
7 8 9];
a = [1;3;5];
b = [1;7;2];
opt_fms = optimset('Display','iter');
x0 = 1;
%[x, fval] = fminsearch(@myfun,x0, opt_fms, z, a, b)
[x, fval] = lsqnonlin(@myfun,x0, [], [], opt_fms, z, a, b)
end
function F = myfun(o, z, a, b)
F = 0;
n = numel(a);
for i = 1:n
for j = 1:n
F = F + (z(i, j) - (sqrt(a(i, 1)+b(j, 1)) + o)).^2;
end
end
end
lsqnonlin结果(该函数的返回值为2的幂):
x =
2.5631
fval =
2.1663e+03
fminsearch结果:
x =
2.5631
fval =
46.5441
这是函数的图以及优化结果(来自fminsearch):