【问题标题】:Fit curve to points when only x-value of y-peak is known当只知道 y 峰值的 x 值时,将曲线拟合到点
【发布时间】:2014-11-06 16:30:25
【问题描述】:

我有一些奇怪的条件需要拟合曲线。我已经尝试在其他地方查找它,但我什至不确定我是否使用了正确的术语。非常感谢任何帮助。

我正在尝试将多项式曲线拟合到一组四个点。其中三点是已知的,但第四点有点棘手。我有最大 y 值的 x 值,但我不知道最大 y 值是多少。例如,假设在 (0,0)、(1,1) 和 (4,0) 处有已知点。最大 y 值在 x=3 处,因此第四点是 (3, ymax)。我如何将四阶多项式曲线拟合到这些条件?提前致谢。

【问题讨论】:

  • 也许我错了,但您不需要n+1 数据点来拟合n-degree 多项式吗?

标签: r model curve-fitting


【解决方案1】:

实际上这是可能的,因为您要求 x=3 处的 y 值应该是最大值。因此,一个 4 次多项式有 5 个待确定的系数,您有以下等式:

y(0) = 0
y(1) = 1
y(4) = 0
dy/dx(3) = 0(x=3 处的一阶导数应为 0)
d2y/dx2(3)

因此,在 x=3 处为 d2y/dx2 选择任何负值并求解 5 个线性方程,您将得到一个 4 次多项式。注意,这种方式得到的x=3处的y值只是局部最大值,不是全局最大值。

【讨论】:

  • 谢谢,看起来是个不错的解决方案。写完后我会发布我想出的 R 代码。谢谢!
【解决方案2】:

根据@fang 的回答填写代数(一点初等微积分、一些代数和一些线性代数):

y = a+b*x+c*x^2+d*x^3+e*x^4

y(0) = 0 -> a=0

为其余的计算设置a=0

y(1) = 1 -> b+c+d+e = 1
y(4) = 0 -> 4*b+16*c+64*d+256*e=0
dy/dx(3)=0 ->
    b+2*x*c+3*x^2*d+4*x^3*e=0 ->
    b+6*c+27*d+108*e=0
d2y/dx2(3)<0 = 2*c+6*d*x+12*e*x^2 < 0 
             = 2*c+18*d+108*e < 0

为最后一个表达式选择一个负值V,比如-1:

V <- -1
A <- matrix(c(1, 1, 1,  1,
              4,16,64,256,
              1, 6,27,108,
              0, 2,18,108),
            ncol=4,byrow=TRUE)
b <- c(1,0,0,V)
(p <- solve(A,b))
## [1]  2.6400000 -2.4200000  0.8933333 -0.1133333

x <- seq(-0.5,5,length=101)
m <- model.matrix(~poly(x,degree=4,raw=TRUE))
y <- m %*% c(0,p)

绘制结果:

par(las=1,bty="l")
plot(x,y,type="l")
points(c(0,1,4),c(0,1,0))
abline(v=3,lty=2)

V 选择一个更大的量级(更负的)值将使解在 y=3 处的峰值更明显。

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2022-01-02
    • 1970-01-01
    • 2013-12-22
    • 2015-04-28
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多