1

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

z²+alpha1*z + alpha2 = 0

我需要在 |z| 的根中找到 alpha1 和 alpha2 的值 < 1. R 或 Matlab 中是否有任何程序能够做到这一点?问题是 alpha 值是未知的。我需要找到多项式的根 <= |1| 的允许区域

4

3 回答 3

2

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

  polyroot(c(1,alpha1,alpha2))

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

  • 选择 aplha1 的范围
  • 选择一个范围的 alpha2
  • 对于 alpha1 和 alpha2 的每个组合,计算根。计算模块 (||),如果 > 1 我们将其删除。
  • 我们得到一个包含 4 列的值网格: alpha1,alpha2,norm1,norm2 其中所有的范数都 <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)

在此处输入图像描述

于 2013-03-15T12:39:21.543 回答
2

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

首先,我将重命名您的变量以使其更易于键入。我还会使用一些符号滥用...

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

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

有3种可能。两个实不同根、一个实根或两个复共轭根。

中间情况发生在 时d = 0,即b = a^2 / 4。这是a vs. b平面上的抛物线。然而,并非该抛物线中的所有点都生成根满足 的多项式|z|<=1。在这种情况下,根是简单-a/2的,所以我们必须添加条件-1 <= a/2 <=1,即-2 <= a <= 2

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

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

平方给出: (a-2)^2 >= d&d <= (a+2)^2

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

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

b >= a-1&b >= -a-1

这意味着b必须位于线b = a-1和之上b=-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)
        }
    }
}

polyroot顺便说一句: is的语法polyroot(c(C, B, A))给出了Ax^2 + Bx + C. 我相信@agstudy 的回复弄错了。

于 2013-03-15T20:45:02.043 回答
0

在matlab中:

roots(1,alpha1,alpha2)

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

于 2013-03-15T12:38:08.107 回答