情報処理演習(10) n次方程式の複素数解 今日のテーマ ・複素数を使った計算。 ・3次方程式の解の公式(カルダノの公式) ・n 次方程式の解法(DKA 法) 3次方程式の解の公式(カルダノの公式) 3次方程式 x3 + a1x 2 + a2 x + a3 = 0 の解は次の方法で求めることができる。 1. x = y − a1 とおくことにより、2次の項を消去すると、 3 y 3 + ay + b = 0 となる。ここで、a と b は a=− a12 + a2 3 b= 2a13 a1a2 − + a3 27 3 である。 2.次に、u と v を未知数とする方程式 u 3 + v 3 + b = 0 と 3uv + a = 0 を考える。もし、a≠0ならば、u と v は次の式で求められる。 ⎛ b b a ⎞⎟ u = ⎜− + + ⎜ 2 4 27 ⎟⎠ ⎝ 2 3 1 3 v=− a 3u √の中が負のときは、虚数になるため、u を計算するには、複素数の3乗根を計算しなく てはいけない。Fortran では、変数のデータ型を複素数(complex 型)にしておけば、複素 数の3乗根(=1/3 乗)が計算できる。 3. 1の3乗根のうち、虚数のものをωとする。 ⎛ 3 ⎞ −1+ i 3 ⎜ ω= = 0.86602540...⎟ (i は虚数単位) ⎜ ⎟ 2 ⎝ 2 ⎠ 4. このとき、 y 3 + ay + b = 0 の解は、次の3つである。 y2 = ω u + ω 2v y1 = u + v 5. y3 = ω 2 u + ω v a1 の関係を使って、xの3つの値を出す。 3 a a x2 = y 2 − 1 x3 = y3 − 1 3 3 上の3つの解から、 x = y − x1 = y1 − a1 3 これが元の3次方程式の解である。以上の手順をカルダノの公式という。この方法で解を求 めるときには、途中の計算に必ず複素数が現れる。(このことが、数学の歴史上、複素数とい うものを取り入れるきっかけになった。) 問題10−1 ラムを作れ。 解答 C カルダノの公式を用いて、3次方程式 x3 + a1x 2 + a2 x + a3 = 0 の解を求めるプログ 上の手順をプログラムにする。 real a1,a2,a3 complex a,b,u,v,y1,y2,y3,omega,x1,x2,x3 ↑変数はすべて複素数型にしてある。 write(*,*) '3 次方程式 x**3+a1*x**2+a2*x+a3=0 の解を求めます' write(*,*) 'a1 を入力してください' read(*,*) a1 write(*,*) 'a2 を入力してください' read(*,*) a2 write(*,*) 'a3 を入力してください' read(*,*) a3 omega=(-0.5 , 0.86602540) ↑複素数型の定数はこのように(実数部,虚数部)の形で表す。 この omega は 1 の3乗根(虚数)である。 a= a の計算式 <--□の部分は、どんな式が入るか? b= b の計算式 u=(-b/2+((b**2)/4+(a**3)/27)**0.5)**(1.0/3.0) v= v の計算式 y1= y1 の計算式 y2= y2 の計算式 y3= y3 の計算式 x1= x1 の計算式 x2= x2 の計算式 x3= x3 の計算式 write(*,*) '答えは次の通りです' write(*,*) 'x1=',x1 write(*,*) 'x2=',x2 write(*,*) 'x3=',x3 write(*,*) '検算します。' write(*,*)'x1 を方程式に代入すると', x1 を代入した式 write(*,*)'x2 を方程式に代入すると', x2 を代入した式 write(*,*)'x3 を方程式に代入すると', x3 を代入した式 end C C プログラムを実行した結果の複素数は、 (実数部,虚数部) の形で表示される。たとえば、3+2i という複素数は、(3.0, 2.0)のように表示される。 問 上のプログラムを使って、次の3次方程式の解を求めよ。 (2) x 3 − 6 x 2 + 11x − 6 = 0 x3 − 2 x 2 + x = 0 (3) x3 + x + 1 = 0 (1) 次に、一般の n 次方程式の解を、反復計算によって求めよう。代表的な方法として、DKA 法を紹介する。 方程式 x n + an −1 x n −1 + L + a2 x 2 + a1 x + a0 = 0 は、複素数の範囲で n 個の解をもつ。いま、解に 近い値を適当にきめて、x1, x2, ..., xn とする。次のような式を計算する。 xk n −1 + an −1 x n −1 + L + a2 xk 2 + a1 xk + a0 (k=1,2,..,n) xk′ = xk − ( xk − x1 )( xk − x2 ) L ( xk − xk −1 )( xk − xk +1 ) L ( xk − xn ) 上の式の分母は、( xk − x j ) の積を j=1,2,...,n(ただし j≠k)にわたってとるということである。 左辺の x'1, x'2, ..., x'n を新しい x1, x2, ..., xn の値として、再び上の式を計算することを繰り返し ていくと、x1, x2, ..., xn はしだいに方程式の解に近づいていく。x1, x2, ..., xn の初期値は任意に とってよい。ここでは、つぎのようにとることにする。 1⎞π ⎛ θ k = ⎜ 2(k − 1) + ⎟ とし、r を定数として 2⎠ n ⎝ a1 + r exp(iθ k ) とする。 (k=1,2,..,n) n ここで、i は虚数単位であり、 exp(iθ ) = cos θ + i sin θ である。r の決め方が難しいが、ここでは 初期値を xk = − 深く考えずに、 「適当に」とることにしよう。DKA 法の計算はすべて複素数で行う必要がある が、FORTRAN には複素数のデータ型(COMPLEX)があるのでプログラムが簡単である。 問題 る。 n次代数方程式 x n + an −1 x n −1 + L + a2 x 2 + a1 x + a0 = 0 の解を複素数の範囲ですべて求め 解答 c 代数方程式の解法(DKA 法) c n 次方程式 a(0)+a(1)*x+a(2)*x**2+...+a(n)*x**n=0 c の n 個の複素数解 x(1),x(2),...,x(n)を求める parameter(n=3) <--この文の意味は、下に説明がある。 real a(0:n) complex c,f,p,x(1:n),xb(1:n) write(*,*) n,'次方程式 a(0)+a(1)*x+a(2)*x**2+...+a(n)*x**n=0' write(*,*)'の解を複素数の範囲で計算します' do k=n,0,-1 write(*,*) k,'次項の係数 a(',k,')を入力してください' read(*,*) a(k) end do c 最高次の係数が1になるように,各項の係数を設定しなおす do k=0,n a(k)=a(k)/a(n) end do c x(1),x(2),...x(n)の初期値を設定する r=10 pi=3.14159265358979 do k=1,n c= (0.0,1.0)*pi*(2.0*(k-1)+0.5)/n x(k)=-a(1)/n+r*exp(c) end do write(*,10) (' (x(',k,')の実数部, 虚数部 ) ',k=1,n) 10 format(3(A4,I1,A19)) write(*,20) (x(k),k=1,n) c DKA 法を実行する do m=1,50 c x(k)の計算 do k=1,n c 分母の計算 p=1 do j=1,n if (k .ne. j) then p=p*(x(k)-x(j)) end if end do c 分子の計算 f=1 do j=n-1,0,-1 f=f*x(k)+a(j) end do c 新しい x(k)の値を保存しておく xb(k)=x(k)-f/p end do c x(k)の値を更新する e=0 do k=1,n e=e+abs(xb(k)-x(k)) x(k)=xb(k) end do write(*,20) (x(k),k=1,3) 20 format (3('(',f8.4,',',f8.4,') ')) if (e .LE. 1.0e-6) stop end do end 練習 (1) 上のプログラムを用いて、次の方程式の解を求めよ x3 + x 2 + x + 1 = 0 (2) (3) x3 + 1 = 0 − 4 − 2 x + x3 = 0 ・parameter(n=3)の意味 この文は、特定の数値(この場合3)を表す文字(この場合n)を作る働きをする。このプ ログラムの中で、3は方程式の次数を表しているため、配列の大きさをきめるときや、DO 文 の繰り返し数など、いろいろなところに表れる。そういうときには、3という数をそのままか くよりもnという文字で表しておくほうが便利なのである。たとえば、上のプログラムを4次 方程式を解くように、作りなおすことを考えてみるとよい。もしnを3と書いてしまうと、プ ログラムのいろんな部分を変更しなければならなくなる。そのようなとき、parameter 文で n=3 としておくと、ここだけを変更すればすむ。 問題10−3 上のプログラムを4次方程式を解くように、書き直してみよ。そして、方程式 x + x + x + x + 1 = 0 の解を求めよ。 4 3 ヒント: 2 parameter 文、2つの format 文の計3箇所を変更。
© Copyright 2024