多变量最小二乘最小化MATLAB

时间:2020-05-01 20:09:11

标签: matlab least-squares minimization

我需要通过找到最小二乘法的全局最小值来找到树变量abc的值。我的功能如下:

f = (1/a)*(asinh((Z(i)/b)^(1/c))^(-1)

其中i是向量Z的索引。向量Z具有任务中给定的9个值。 我也有一个s有9个值的向量。 最小二乘法需要将函数f计算出的值与向量s中的值之和求和。它应该看起来像这样:

((s(i)-f(i))/s(i))^2

我也有值abc的界限:

10e10>a>10e1910e-7>b>5010e-15>c>10

我尝试使用lsqnonlin,但不知道如何使用。感谢您的帮助!

我试图做这样的事情:

function f=Fsigma(x, Z, sigma)
f=0;
for i=1:length(sigma)
    f=f+((sigma(i)-((1/x(1,:))*(asinh((Z(i)/x(2,:))^(1/x(3,:)))^(-1))))/sigma(i))^2
end
end

并像这样在lsqnonlin中调用此函数:

Z= [1.49E+18 1.49E+19 1.49E+20 1.99E+15 1.99E+16 1.99E+17 1.49E+13 1.49E+14 1.49E+15];
sigma = [55.1705 79.1016 105.636 25.4809 40.8572 61.7238 12.8147 21.4054 34.8319];

a=linspace(10e10,10e19);
b=linspace(10e-7,50);
c=linspace(10e-15,10);
x=[a; b; c];
p=lsqnonlin(Fsigma(x,Z,sigma));

1 个答案:

答案 0 :(得分:1)

好的@Agata,我将详细介绍它,以便您可以学习一些基础知识。

首先,如何将功能传递给功能:功能句柄@运算符

fnc = @(x) Fsigma(x,Z,sigma);

fnc是一个对象-实际上,它是指向功能Fsigma的东西。但是,它甚至通过声明其唯一的输入为Fsigma来掩盖x的附加输入(这称为{em>匿名函数句柄,由()表示) ,您可以在其中定义调用fnc的人可以使用的输入。此行中Fsigma的其他输入是他们在该行中具有 的变量的值

边界 边界应作为向量提供:

% bounds
lb = [  10e10;
        10e-7;
        10e-15];
ub = [  10e19;
        50;
        10];

初始猜测+优化调用,如果您阅读the docs of lsqnonlin,则需要进行初始猜测

% initial guess
x0 = ones(3,1);
% optimization call: x = lsqnonlin(fun,x0,lb,ub)
[p,fval] = lsqnonlin(fnc,x0,lb,ub)

费用功能说明 如果您不提供汇总费用,而是提供一系列错误,则lsqnonlin会更好(请再次参阅文档)。因此,我调整了您的Fsigma功能

function f = Fsigma(x, Z, sigma)
f = ((sigma-((1/x(1))./ asinh((Z./x(2)).^(1/x(3)))) )./sigma).^2;
end

如果您要使用一个输出(大多数优化算法需要使用其成本函数),则可以使用fmincon

看看完整代码

Z = [1.49E+18 1.49E+19 1.49E+20 1.99E+15 1.99E+16 1.99E+17 1.49E+13 1.49E+14 1.49E+15];
sigma = [55.1705 79.1016 105.636 25.4809 40.8572 61.7238 12.8147 21.4054 34.8319];

% bounds
lb = [  10e10;
        10e-7;
        10e-15];
ub = [  10e19;
        50;
        10];
% initial guess
x0 = ones(3,1);

% create an anyonymous function handle (using @(x)
fnc = @(x) Fsigma(x,Z,sigma);
% optimization call: x = lsqnonlin(fun,x0,lb,ub)
[p,fval] = lsqnonlin(fnc,x0,lb,ub);

% optimization call: x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
fnc2 = @(x) sqrt(sum(fnc(x).^2));
[p2,fval2] = fmincon(fnc2,x0,[],[],[],[],lb,ub);


% cost function
function f = Fsigma(x, Z, sigma)
f = ((sigma-((1/x(1))./ asinh((Z./x(2)).^(1/x(3)))) )./sigma).^2;
end

PS:请注意,该社区不是编码服务,所以下次您的阅读内容会如此!