Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab-用约束参数拟合曲线_Matlab_Curve Fitting - Fatal编程技术网

Matlab-用约束参数拟合曲线

Matlab-用约束参数拟合曲线,matlab,curve-fitting,Matlab,Curve Fitting,对于(x,y)数据集,让曲线由a,b,c中的表达式给出。。。等,如f='a*exp(b*x)+c',安装为cfit=fit(x,y,f) 假设我们有一组约束,例如b>0,c+b>a/2。在这种情况下,我应该如何使用fit命令?一种简单的方法是,如果参数值超出约束范围,则fitted函数返回非常大的值,并产生非常大的错误。这种“砖墙”方法不是最佳方法,当拟合参数值接近边界条件时,会产生问题。值得一试,因为它实现起来很快,并且可以在简单的情况下工作。注意从边界限制内的初始参数值开始。虽然可以设置一个

对于(
x
y
)数据集,让曲线由
a
b
c
中的表达式给出。。。等,如
f='a*exp(b*x)+c'
,安装为
cfit=fit(x,y,f)


假设我们有一组约束,例如
b>0
c+b>a/2
。在这种情况下,我应该如何使用
fit
命令?

一种简单的方法是,如果参数值超出约束范围,则fitted函数返回非常大的值,并产生非常大的错误。这种“砖墙”方法不是最佳方法,当拟合参数值接近边界条件时,会产生问题。值得一试,因为它实现起来很快,并且可以在简单的情况下工作。注意从边界限制内的初始参数值开始。

虽然可以设置一个较低的边界来强制执行
b>0
,但我认为不可能通过
fit()
正确强制执行
c+b>a/2
。但最终,每个拟合问题也可以被视为“最小化曲线到数据的距离”问题,因此
fmincon()
可以用来实现您的目标:

%some sample x values
xdata = rand(1000,1);
%some parameters a,b,c
a = 2;
b = 3;
c = 4;
%resulting y values + some noise
ydata=a*exp(b*xdata)+c+rand(1000,1)*10-5;
plot(xdata,ydata,'o')

%function to minimize. It returns the sum of squared distances between the polynom and the data.
fun = @(coefs) sum((coefs(1)*exp(coefs(2).*xdata)+coefs(3)-ydata).^2);
%nonlinear constaint to enforce c+b>a/2, which is the same as -(c+b-a/2)<0
nonlcon = @(coefs)deal(-(coefs(3)+coefs(2)-coefs(1)/2), 0);
% lower bounds to enforce b>0
lb = [-inf 0 -inf];
%starting values
x0 = [1 1 1];
%finally find the coefficients (which should approximately be the values of a, b and c)
coefs = fmincon(fun,x0,[],[],[],[],lb,[],nonlcon)
%某些示例x值
扩展数据=兰特(1000,1);
%一些参数a、b、c
a=2;
b=3;
c=4;
%结果y值+一些噪波
ydata=a*exp(b*xdata)+c+rand(1000,1)*10-5;
绘图(扩展数据、ydata、“o”)
%函数最小化。它返回多项式和数据之间的平方距离之和。
fun=@(coefs)和((coefs(1)*exp(coefs(2)。*xdata)+coefs(3)-ydata)。^2);
%强制c+b>a/2的非线性常数,与-(c+b-a/2)0相同
lb=[-inf 0-inf];
%起始值
x0=[1];
%最后找到系数(应近似为a、b和c的值)
coefs=fmincon(fun、x0、[]、[]、[]、[]、[]、lb、[]、非LCON)

对于仅为数值的约束,例如
b>0
,可以使用和边界参数来指定这些约束。对于更复杂的关系,如
c+b>a/2
,您必须采取类似的方法,将函数输出设置为高值,如生成大错误。例如,假设我这样定义我的函数:

function y = my_fcn(a, b, c, x)
  if (c+b > a/2)
    y = a.*exp(b.*x)+c;
  else
    y = flintmax().*ones(size(x));
  end
end
我可以创建一组噪声测试数据,如下所示:

a = 4;
b = 2;
c = 1;
x = (0:0.01:2).';
y = my_fcn(a, b, c, x) + 40.*(rand(size(x))-0.5);
然后拟合一条曲线(请注意,您必须使用,因为a因某些原因不起作用):

请注意,拟合值接近原始值,但由于噪声的原因,不完全匹配。我们可以像这样想象合适度:

plot(x, y);
hold on;
plot(x, my_fcn(params.a, params.b, params.c, x), 'r');

虽然这听起来很像,但我不相信这是重复的。这个问题涉及拟合线的约束点,而这个问题只是想将参数约束到一个范围。是的,工具箱允许处理异常值,它位于xy空间,但我问的是参数空间。是的,我正在使用它,例如,替换
0,但我不确定如何引入,在给定的情况下,
b
~1时会出现一个大错误。
plot(x, y);
hold on;
plot(x, my_fcn(params.a, params.b, params.c, x), 'r');