0

在此处输入图像描述我不知道如何在 MATLAB 中选择lbandub以及如何将我的函数与数据相匹配,我的意思是我有一些输出,但它们不正确,lsqcurvefitx0

这是我的数据:

xdata= [22.8700000000000;7.92000000000000;3.45000000000000;1.78000000000000;
        1.57000000000000;6.41000000000000;12.9000000000000;1.82000000000000;
        1.86000000000000;3.71000000000000;12.0900000000000;15.9900000000000;
        18.9600000000000;23.1500000000000;23.4500000000000;24.8200000000000;
        25.0700000000000;13.2800000000000];
ydata= [8.44300000000000;7.92100000000000;7.64600000000000;7.51600000000000;
        7.47100000000000;7.82100000000000;8.03200000000000;7.76200000000000;
        7.77400000000000;7.87800000000000;8.07000000000000;8.26000000000000;
        8.40000000000000;8.52000000000000;8.52000000000000;8.57000000000000;
        8.58000000000000;8.03200000000000];

然后我将 myfunc 放在一个单独的 m 文件中:

 function F = myfun(x,xdata)
  F=x(1)*(1-x(2)^2)./((1+x(2)^2+2*x(2)*cosd(xdata)).^1.5);

我有x(1)x(2),我想在拟合我的数据后估计未知,并且我知道 kx(2)不会是负值。

所以我这样设置lsqcurvefit

[x, resnorm]=lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, options)

这是结果:

x = 1.5000 -0.4945
resnorm = 52.1739

它显示了一个负值x(2)

请你帮助我好吗?

非常感谢您回答我的问题,现在在命令计算了 x 和 resnorm 之后,我在函数中使用了结果,这意味着我使用了 x(1)=92.8054 x(2)=0.7427

所以;

F=92.8054*(1-(0.7427)^2)./((1-0.7427)^2+2*(0.7427)*cosd(xdata)).^1.5;

现在我有向量 F ,当我绘制我的数据和结果时, plot(xdata, ydata, 'o', xdata, F, '*')

我不明白为什么 y 轴的范围如此不同!也许我需要将 x(3) 添加到我的函数中。

我附上了图。在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

1

您的上限和下限必须是与您尝试估计的元素数量相同的向量,在您的情况下为 x。

因此,例如,如果您希望 x(1) 无界且 x(2) 介于 0 和 1.5 之间,请尝试

[x, resnorm]=lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, [-inf, 0], [inf, 1.5], options)

要计算 F,请使用您已经创建的目标函数:

F = myfun(x, xdata)然后按照你已经拥有的方式绘制它。在下面的评论中,您已将 a 切换+为 a -,这就是您的图表未对齐的原因。

于 2012-07-30T11:18:06.333 回答
1

参数lbub是您的输出的下限和上限,即您的优化值xopt将满足lb <= xopt <= ub

正如您已经知道的那样,这x(2)不能是负数,您已经有一个下限,即 0,即lb(2) = 0。现在您只需要为 和 定义下限和x(1)上限。x(1)x(2)

以下代码将限制x(1) to [-inf, 1e3]and x(2) to [0, 1e3]

lb = [-inf, 0];
ub = [1e3, 1e3];
[x, resnorm] = lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, ...
                           lb, ub, options)

我也有点困惑你的方法奏效了。根据文档,如果您没有上限或下限但想提供,则应传递空向量options,即您的示例应阅读

[x, resnorm] = lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, ...
                           [], [], options)

可能,我们有不同版本的 Matlab。

于 2012-07-30T11:21:25.180 回答
0

为什么不使用简单的最小二乘解决方案:

in = [ones(size(xdata, 1), 1), xdata];
w = in \ ydata;
ydata_fit = in * w;

结果:

在此处输入图像描述

>> disp(w)
    7.5744
    0.0401
于 2012-07-30T19:12:11.483 回答