我对多项式有一个小问题:
z²+alpha1*z + alpha2 = 0
我需要通过| z |的根来获取alpha1和alpha2的值< 1. R或Matlab中是否有任何程序可以执行此操作? 问题是alpha值是未知的。我需要找到允许的区域,其中多项式的根是< = | 1 |
答案 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-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)
}
}
}
BTW:polyroot
的语法polyroot(c(C, B, A))
给出了Ax^2 + Bx + C
的根。我相信@agstudy的反应是错误的。
答案 1 :(得分: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)
答案 2 :(得分:0)