我对多项式有一个小问题:
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 的回复弄错了。