多項式に小さな問題があります:
z²+alpha1*z + alpha2 = 0
|z| の根で alpha1 と alpha2 の値を見つける必要があります。< 1. R または Matlab で実行できるプログラムはありますか? 問題は、アルファ値が不明であることです。多項式の根が <= |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 つの可能性があります。2 つの別個の実根、1 つの実根、または 2 つの複素共役根。
d = 0
中間のケースは、 、つまりの場合に発生しb = a^2 / 4
ます。これはa vs. b
平面の放物線です。ただし、この放物線のすべての点が、根が を満たす多項式を生成するわけではありません|z|<=1
。この場合、ルートは単にであるため、条件、つまり を-a/2
追加する必要があります。-1 <= a/2 <=1
-2 <= a <= 2
では、最初のケースを考えてみましょう。a vs. b
2 つの異なる実根を持つ多項式を生成する平面内の点は、放物線の下にあります。つまり、それらは を満たす必要があり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)
}
}
}
ところで: is の構文polyroot
はpolyroot(c(C, B, A))
の根を与えますAx^2 + Bx + C
。@agstudy の応答が間違っていたと思います。