多项式根

时间:2013-03-15 12:30:20

标签: r matlab

我对多项式有一个小问题:

z²+alpha1*z + alpha2 = 0

我需要通过| z |的根来获取alpha1和alpha2的值< 1. R或Matlab中是否有任何程序可以执行此操作? 问题是alpha值是未知的。我需要找到允许的区域,其中多项式的根是< = | 1 |

3 个答案:

答案 0 :(得分:2)

@Jonel_R,您的问题可以通过分析解决。

首先,我会重命名您的变量,以便更容易输入。我还会使用一些符号滥用...

我们希望找到值(a, b),以便z^2 + a z + b == 0的根满足属性|z|<=1

根由(-a +- sqrt(d))/2给出,其中d = a^2 - 4b

有三种可能性。两个真正不同的根,一个真根或两个复共轭根。

中间案例发生在d = 0,i。 e。,b = a^2 / 4。这是a vs. b平面上的抛物线。然而,并非此抛物线中的所有点都生成其根满足|z|<=1的多项式。在这种情况下,根只是-a/2,所以我们添加条件-1 <= a/2 <=1,i。例如,-2 <= a <= 2

现在让我们考虑第一种情况。生成具有两个不同真根的多项式的a vs. b plae中的点位于抛物线下方。例如,他们必须满足b < a^2/4。附加条件是|z| = |(-a +- sqrt(d))/2| <= 1

条件可写为-1 <= (-a +- sqrt(d))/2 <= 1,其中+-表示两个根必须满足条件。解决这个问题我们得到:
a-2 <= sqrt(d) <= a+2&amp; a-2 <= -sqrt(d) <= a+2

由于sqrt(d)-sqrt(d)必须位于[a-2, a+2]d > 0区间,因此此区间的内部必须包含零。这意味着-2 < a < 2

条件可以加入: a-2 <= -sqrt(d) < 0 < sqrt(d) <= a+2

Squaring给出: (a-2)^2 >= d&amp; d <= (a+2)^2

d <= a^2 - 4a + 4&amp; d <= a^2 + 4a + 4

-4b <= -4a + 4&amp; -4b <= +4a + 4

b >= a-1&amp; b >= -a-1

这意味着b必须位于行b = a-1b=-a-1之上。此外,a必须位于[-2,2]。当然,我们必须b < a^2/4。哇...

现在最后一个案例:复杂的根源。这更容易。自d < 0起,根就是-a/2 +- i * sqrt(-d)/2。其绝对值为a^2/4 - d/4。这简单地等于b。所以条件为b <= 1,并且一如既往地b位于抛物线上方。

那就是......相当有趣的问题。 : - )

您可以尝试以下测试功能:它将蓝色和复杂根部的实根绘制成红色。

test <- function(x=2, n=10000)
{
    plot(c(-x,x), c(-x,x), type="n")

    plot(function(a) (a^2)/4, from=-x, to=x, add=T)

    plot(function(a) a-1, from=-x, to=x, add=T)

    plot(function(a) -a-1, from=-x, to=x, add=T)

    a <- runif(n, -x, x)

    b <- runif(n, -x, x)

    for( i in 1:n )
    {
        if( all(abs(polyroot(c(b[i],a[i],1))) <= 1) )
        {
            col <- ifelse(b[i] < 0.25*a[i]^2, "blue", "red")

            points(a[i], b[i], pch=".", col=col)
        }
    }
}

BTW:polyroot的语法polyroot(c(C, B, A))给出了Ax^2 + Bx + C的根。我相信@agstudy的反应是错误的。

答案 1 :(得分:1)

与R中的matlab解决方案类似,

  polyroot(c(1,alpha1,alpha2))

编辑这里是一种以图形方式获取alpha值的方法,它可用于获得有关合理值的直觉。这里的想法是:

  • 选择一系列aplha1
  • 选择一系列alpha2
  • 对于alpha1和alpha2的每个组合,计算根。计算模块(||),如果&gt; 1我们将其删除。
  • 我们得到一个包含4列的值网格:alpha1,alpha2,norm1,norm2其中所有规范都是&lt; 1
  • 我绘制alpha1与alpha2以获得区域......

所以代码

## I choose alpha1 in interavl [-1,1]
alpha1 <- seq(-1, 1, length=200)
## I choose alpha2 in interavl [-2,2]
alpha2 <- seq(-2, 2, length=200)
dat <- expand.grid(data.frame(alpha1,alpha2))
## for each combination of (alpha1,alpha2)
## i compute the module of the roots 
## I replace |roots|> 1 by NA
ll <- apply(dat,1,function(x) {
  rr =Mod(polyroot(c(1,x['alpha1'],x['alpha2'])))
  res <- ifelse(rr>1,NA,rr)
  if (length(res)==1) res <- rep(res,2)
  if (length(res)==0) res <- rep(NA,2)
  else res
  })
dat <- na.omit(cbind(dat,t(ll)))
## finally i plot the result
library(lattice)
xyplot(alpha2~alpha1,data=dat)

enter image description here

答案 2 :(得分:0)

在matlab中:

roots(1,alpha1,alpha2)

请参阅http://www.mathworks.se/help/matlab/ref/roots.html