我需要通过找到最小二乘法的全局最小值来找到树变量: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));
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:请注意,该社区不是编码服务,所以下次您的阅读情况要好!