最小均方根最小化matlab

问题描述 投票:0回答:1

我需要通过找到最小二乘法的全局最小值来找到树变量: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));
matlab least-squares minimization
1个回答
0
投票

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

首先,如何将功能交付给功能:功能手柄又名。 @运算符

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

fnc是一个对象-实际上,它是指向函数Fsigma的对象。但是,它甚至通过声明Fsigma的唯一输入为x来掩盖了()的其他输入(这由fnc表示为anonymous function handle,在其中定义输入可能会使用调用Fsigma的人。% bounds lb = [ 10e10; 10e-7; 10e-15]; ub = [ 10e19; 50; 10]; 的其他输入是该行具有此行的变量的值。

边界

边界应作为向量提供:
the docs of lsqnonlin

初始猜测+优化调用

如果您阅读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

看看完整代码

fmincon

PS:请注意,该社区不是编码服务,所以下次您的阅读情况要好!

© www.soinside.com 2019 - 2024. All rights reserved.