R中曲线和直线之间的插值

时间:2013-12-02 01:19:10

标签: r interpolation

我有两个功能:

     x = seq(0, 3, len = 100)

     y1 = function(x){
           x^2 -2*x +2
        }
    y2 = function(x){
      -4*x + 1
        }

为了找到两个函数之间的插值,得到插值函数的正值,我知道

   (1-z)*y1(x) + z*y2(x)  = 0
   (1-z)*y1'(x) + z*y2'(x) = 0

然后我知道z = y1(x)/(y1(x)-y2(x))所以我得到了

   2*x^3-10*x^2+16*x-12 = 0 

我使用R来查找上述函数的根:

   > polyroot(c(-12, 16, -10, 2))
   [1] 1+1i 1-1i 3+0i

   x  = uniroot(function(x)2*x^3 -10*x^2+16*x-12, lower= 0, upper = 3)
   $root
   [1] 3

   $f.root
   [1] 0

   $iter
   [1] 0

   $estim.prec
   [1] 0

然后

   z = (x^2 - 2*x +2)/ (x^2+2*x+1)

  > z
  [1] 0.3125

  y3 = function(x){(1-z)*(x^2-2*x+2) + z*(-4*x+1)}
  y3(x)

但是y3(x)仍然是负面的部分,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

首先,您问题中某些代码的精简版。

x = seq(0, 3, len = 100)
y1 = function(x) x^2 -2*x +2
y2 = function(x) -4*x + 1
z = function(x) y1(x)/(y1(x)-y2(x))

现在有一些可视化的绘图。

plot(x,y1(x),ylim=c(-12,5),type="l",ylab="y")
lines(x,y2(x),col="blue")
lines(x,z(x),col="red")
abline(h=0,v=0,col="gray")
legend("bottomleft",c("y1(x)","y2(x)","z(x)"),fill=c("black","blue","red"))

enter image description here

由于你的y3(x)函数仍然是负数的原因,我认为这更像是一个数学问题,而不是一个编程问题。绘制y3(x),我确实看到它们有许多负值。我对你问题的其他部分不太清楚,所以我不确定如何解决你问题的这一部分。