2014-11-06 47 views
1

我有一些奇怪的條件需要擬合曲線來處理。我試過在其他地方查找它,但我甚至不確定我是否使用了正確的術語。任何幫助深表感謝。當只有y峯的x值已知時將曲線擬合到點

我試圖擬合一個四點的多項式曲線。其中三點是已知的,但第四點有點棘手。我有最大y值的x值,但我不知道最大y值是多少。例如,假設在(0,0),(1,1)和(4,0)處存在已知點。最大y值在x = 3,所以第四點是(3,ymax)。我將如何擬合這些條件的四階多項式曲線?提前致謝。

+1

也許我錯了,但是你不需要'n + 1'個數據點來擬合一個'n'次多項式嗎? – nrussell 2014-11-06 17:01:25

回答

4

其實這是可能的,因爲你需要在x = 3的y值應該是最大的。所以,一定程度的4多項式必須確定5個係數和具有下列等式:

Y(0)= 0
Y(1)= 1
Y(4)= 0
DY/DX (3)= 0(一階導數在x = 3應爲0)
D2Y/DX2(3)< 0(第二導數在x = 3應該是負的)

所以,挑選D2Y任何負值/ dx2在x = 3並求解5個線性方程,你將得到一個4次多項式。請注意,以這種方式獲得的x = 3處的y值只是局部最大值,而不是全局最大值。

+0

我站好了! – eipi10 2014-11-06 21:46:08

+0

謝謝,看起來像一個偉大的解決方案。當我完成寫作時,我會發布我提出的R代碼。謝謝! – 2014-11-08 02:00:32

2

灌裝在從@方舟子的答案代數(有點初等微積分,代數運算,以及一些線性代數):

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) 

enter image description here

挑選一個較大量值(更負)值爲V會使該解決方案在y = 3時更尖銳。