【问题标题】:Least squares minimization for multiple variables matlab多变量matlab的最小二乘最小化
【发布时间】:2020-05-01 20:09:11
【问题描述】:

我需要找到树变量的值: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));

【问题讨论】:

  • 请贴出你目前拥有的代码,这样你的问题就更清楚了
  • @max 我刚刚发布了我的代码。我试图更改我在文档中找到的示例,因此我将能够找到所有树变量:a、b ad c 而不是只找到一个

标签: matlab least-squares minimization


【解决方案1】:

好的@Agata,我会详细介绍,所以你可以学习一些基础知识。

首先,如何将函数传递给函数:函数句柄 aka。 @-运算符

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

fnc 是一个对象——事实上,它是一个指向函数Fsigma 的东西。但是,它甚至通过声明它的唯一输入是 x(这称为 匿名函数句柄,由 () 表示,在其之间定义调用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

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:请注意,这个社区不是编码服务,下次请继续阅读!

【讨论】:

  • 非常感谢您的帮助!不幸的是我对matlab完全陌生,所以这项任务对我来说太难了......我还有一个问题,我不知道为什么最小二乘(对于用变量a,b,c调用的函数f(从结果)与 sigma 的值相比)等于 1,而它应该尽可能接近 0...
  • 我假设你在谈论函数Fsigma。问题是不恰当的。事实上,两种算法都停止在最初的猜测(并告诉你,它们没有找到递减方向)。您可能会通过缩放参数来使用它,因为它们的范围非常奇怪(第一个索引 - 您所谓的 a 在 [10e10,10e19] 中,而另一个参数在 (0, 50]
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多