我对多项式有一个小问题:
z²+alpha1*z + alpha2 = 0
我需要在 |z| 的根中找到 alpha1 和 alpha2 的值 < 1. R 或 Matlab 中是否有任何程序能够做到这一点?问题是 alpha 值是未知的。我需要找到多项式的根 <= |1| 的允许区域
类似于 R 中的 matlab 解决方案,
polyroot(c(1,alpha1,alpha2))
在这里编辑一种以图形方式获取值的方法alpha,它可以用来获得关于合理值的直觉。这里的想法是:
所以代码
## 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)

@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 的回复弄错了。