【问题标题】:Is it possible to fit to a parametric curve in Matlab?是否可以在 Matlab 中拟合参数曲线?
【发布时间】:2017-01-30 21:22:42
【问题描述】:

我想将由n 维向量data(值在-1 和1 之间,对应的x 值linspace(0,9,n))给出的数据集拟合到由下式给出的参数曲线

x = cos(t)/sqrt(1-(a/b)^2)
y = b*sin(t)-a

对于a < b0 < t < pi。这条曲线是椭圆的上半部分,它已降低到 x 轴下方a,并在 -1 和 1 处与 x 轴相交。我正在拟合参数 a,b

y(x)的形式上写这个函数似乎是不可能的(编辑:不是这样,见 cmets - 但是,我仍然想知道以下问题的答案:)... Matlab中的拟合可以从参数形式完成吗?怎么样?

谢谢。

【问题讨论】:

  • 你不能把你的函数写成y = @(x,a,b)b*sin(acos(x*sqrt(1 - (a/b)^2))) - a。而且由于它可以写成这种形式,您可以使用fitnlm 来适应?
  • @SomeGuy 嗯,这可能会起作用,但我担心会发生一些奇怪的事情,这是由三角函数中的主要值混乱引起的。此外,关于间隔的信息t 以这种方式丢失了.. 但感谢您的建议(如果您发现它确实有效,我很乐意接受该实现作为答案)!
  • @SomeGuy 我认为它有效...表达式简化为y = b*sqrt(1-x^2*(1-(a/b)^2))-a,这似乎有效。再次感谢。但是,我认为参数拟合是否可能的问题本身仍然很有趣,所以我暂时不讨论。

标签: matlab data-fitting


【解决方案1】:

您可以以y = f(x) 格式编写函数,然后使用fitnlm 估计非线性模型的参数。

fh = @(x,a,b)b*sin(acos(x*sqrt(1 - (a/b)^2))) - a % Define y = f(x)
x = [-1:0.01:1]; % Generate some x values
yval = fh(x,1,2); % Calculate y values for the x 
yval_ = yval + 0.1*rand(1,201); % Add artifical noise

nonLinMdl = fitnlm(x,yval_,@(p,x)fh(x,p(1),p(2)),[1.5, 2.5])

nonLinMdl = 


Nonlinear regression model:
    y ~ y(x,p1,p2)

Estimated Coefficients:
          Estimate       SE       tStat       pValue  
          ________    ________    ______    __________

    p1    0.71909     0.053201    13.516    5.8209e-30
    p2     1.7668     0.055472    31.849    4.6625e-80


Number of observations: 201, Error degrees of freedom: 199
Root Mean Squared Error: 0.032
R-Squared: 0.988,  Adjusted R-Squared 0.988
F-statistic vs. zero model: 6.36e+04, p-value = 5.87e-280

请注意,计算的参数与我们使用的 (1,2) 不同。这可能与函数形状对于不同的参数集相同的事实有关。你也可以尝试不同的起点。

ycalc = fh(x,nonLinMdl.Coefficients.Estimate('p1'),nonLinMdl.Coefficients.Estimate('p2'))
plot(x,yval_,x,ycalc)

我无法上传文件,因为我处于受限环境中,但我绘制了两个系列,并且模型计算的值非常接近输入数据。

【讨论】:

  • 感谢您的回答!但是,如果您使用所选值和找到的值绘制函数,它们会有所不同。我确实相信fh(x) 可以被证明是单射的,所以它们应该有所不同。但是,当只使用有限数量的点(或噪声很大)时,我可以看到不同的参数集如何同样适合。希望在这种特殊情况下这不会成为问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多