多变量matlab的最小二乘最小化
Least squares minimization for multiple variables matlab
我需要通过找到最小二乘法的全局最小值来找到树变量的值:a
、b
和 c
。我的函数如下:
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
我也有值 a
、b
和 c
的边界:
10e10>a>10e19
, 10e-7>b>50
, 10e-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));
好的@Agata,我将详细介绍它,以便您学习一些基础知识。
首先,如何将函数传递给函数:又名函数句柄。 @
-运算符
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:请注意,本社区不是编码服务,下次请阅读!
我需要通过找到最小二乘法的全局最小值来找到树变量的值:a
、b
和 c
。我的函数如下:
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
我也有值 a
、b
和 c
的边界:
10e10>a>10e19
, 10e-7>b>50
, 10e-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));
好的@Agata,我将详细介绍它,以便您学习一些基础知识。
首先,如何将函数传递给函数:又名函数句柄。 @
-运算符
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:请注意,本社区不是编码服务,下次请阅读!