Keyword: 実多項式の根
概要
本サンプルは実多項式の根を求めるFortranによるサンプルプログラムです。 本サンプルでは一つ目の例で以下に示される次数が5の多項式の根を求めて出力します。二つ目の例では同じ問題を解き求められた解の誤差推定を出力します。
※本サンプルはnAG Fortranライブラリに含まれるルーチン c02agf() のExampleコードです。本サンプル及びルーチンの詳細情報は c02agf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はc02agf のマニュアルページを参照)1 2 3 4 5 6 7 8 9
このデータをダウンロード |
C02AGF Example Program Data Example 1 5 1.0 2.0 3.0 4.0 5.0 6.0 Example 2 5 1.0 2.0 3.0 4.0 5.0 6.0
- 1行目はタイトル行で読み飛ばされます。
- 4行目に一つ目の例の多項式の次数(n)を指定しています。
- 5行目に一つ目の例の各項の係数(a)を指定しています。
- 8行目に二つ目の例の多項式の次数(n)を指定しています。
- 9行目に二つ目の例の各項の係数(a)を指定しています。
出力結果
(本ルーチンの詳細はc02agf のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
この出力例をダウンロード |
C02AGF Example Program Results Example 1 Degree of polynomial = 5 Computed roots of polynomial z = -1.4918E+00 z = 5.5169E-01 +/- 1.2533E+00*i z = -8.0579E-01 +/- 1.2229E+00*i Example 2 Degree of polynomial = 5 Computed roots of polynomial Error estimates (machine-dependent) z = -1.4918E+00 +0.0000E+00*i 1.2E-15 z = 5.5169E-01 +1.2533E+00*i 1.1E-16 z = 5.5169E-01 -1.2533E+00*i 1.1E-16 z = -8.0579E-01 +1.2229E+00*i 1.5E-16 z = -8.0579E-01 -1.2229E+00*i 1.5E-16
- 7行目に一つ目の例の入力された多項式の次数が出力されています。
- 11~13行目に一つ目の例の多項式の根(実部と虚部)が出力されています。
- 18行目に二つ目の例の入力された多項式の次数が出力されています。
- 23~27行目に二つ目の例の多項式の根(実部と虚部)と誤差推定が出力されています。
ソースコード
(本ルーチンの詳細はc02agf のマニュアルページを参照)
※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
このソースコードをダウンロード |
! C02AGF Example Program Text ! Mark 23 Release. nAG Copyright 2011. MODULE c02agfe_mod ! C02AGF Example Program Module: Parameters ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nin = 5, nout = 6 LOGICAL, PARAMETER :: scal = .TRUE. END MODULE c02agfe_mod PROGRAM c02agfe ! C02AGF Example Main Program ! .. Use Statements .. USE c02agfe_mod, ONLY : nout ! .. Implicit None Statement .. IMPLICIT NONE ! .. External Subroutines .. EXTERNAL ex1, ex2 ! .. Executable Statements .. WRITE (nout,*) 'C02AGF Example Program Results' CALL ex1 CALL ex2 END PROGRAM c02agfe SUBROUTINE ex1 ! .. Use Statements .. USE nag_library, ONLY : c02agf, nag_wp USE c02agfe_mod, ONLY : nin, nout, scal ! .. Implicit None Statement .. IMPLICIT NONE ! .. Local Scalars .. REAL (KIND=nag_wp) :: zi, zr INTEGER :: i, ifail, n, nroot ! .. Local Arrays .. REAL (KIND=nag_wp), ALLOCATABLE :: a(:), w(:), z(:,:) ! .. Intrinsic Functions .. INTRINSIC abs ! .. Executable Statements .. WRITE (nout,*) WRITE (nout,*) WRITE (nout,*) 'Example 1' ! Skip heading in data file READ (nin,*) READ (nin,*) READ (nin,*) READ (nin,*) n ALLOCATE (a(0:n),w(2*(n+1)),z(2,n)) READ (nin,*) (a(i),i=0,n) WRITE (nout,*) WRITE (nout,99999) 'Degree of polynomial = ', n ifail = 0 CALL c02agf(a,n,scal,z,w,ifail) WRITE (nout,99998) 'Computed roots of polynomial' nroot = 1 DO WHILE (nroot<=n) zr = z(1,nroot) zi = z(2,nroot) IF (zi==0.0E0_nag_wp) THEN WRITE (nout,99997) 'z = ', zr nroot = nroot + 1 ELSE WRITE (nout,99997) 'z = ', zr, ' +/- ', abs(zi), '*i' nroot = nroot + 2 END IF END DO 99999 FORMAT (/1X,A,I4) 99998 FORMAT (/1X,A/) 99997 FORMAT (1X,A,1P,E12.4,A,E12.4,A) END SUBROUTINE ex1 SUBROUTINE ex2 ! .. Use Statements .. USE nag_library, ONLY : a02abf, c02agf, nag_wp, x02ajf, x02alf USE c02agfe_mod, ONLY : nin, nout, scal ! .. Implicit None Statement .. IMPLICIT NONE ! .. Local Scalars .. REAL (KIND=nag_wp) :: deltac, deltai, di, eps, epsbar, f, & r1, r2, r3, rmax INTEGER :: i, ifail, j, jmin, n ! .. Local Arrays .. REAL (KIND=nag_wp), ALLOCATABLE :: a(:), abar(:), r(:), w(:), z(:,:), & zbar(:,:) INTEGER, ALLOCATABLE :: m(:) ! .. Intrinsic Functions .. INTRINSIC abs, max, min ! .. Executable Statements .. WRITE (nout,*) WRITE (nout,*) WRITE (nout,*) 'Example 2' ! Skip heading in data file READ (nin,*) READ (nin,*) READ (nin,*) n ALLOCATE (a(0:n),abar(0:n),r(n),w(2*(n+1)),z(2,n),zbar(2,n),m(n)) ! Read in the coefficients of the original polynomial. READ (nin,*) (a(i),i=0,n) ! Compute the roots of the original polynomial. ifail = 0 CALL c02agf(a,n,scal,z,w,ifail) ! Form the coefficients of the perturbed polynomial. eps = x02ajf() epsbar = 3.0_nag_wp*eps DO i = 0, n IF (a(i)/=0.0_nag_wp) THEN f = 1.0_nag_wp + epsbar epsbar = -epsbar abar(i) = f*a(i) ELSE abar(i) = 0.0E0_nag_wp END IF END DO ! Compute the roots of the perturbed polynomial. ifail = 0 CALL c02agf(abar,n,scal,zbar,w,ifail) ! Perform error analysis. ! Initialize markers to 0 (unmarked). m(1:n) = 0 rmax = x02alf() ! Loop over all unperturbed roots (stored in Z). DO i = 1, n deltai = rmax r1 = a02abf(z(1,i),z(2,i)) ! Loop over all perturbed roots (stored in ZBAR). DO j = 1, n ! Compare the current unperturbed root to all unmarked ! perturbed roots. IF (m(j)==0) THEN r2 = a02abf(zbar(1,j),zbar(2,j)) deltac = abs(r1-r2) IF (deltac<deltai) THEN deltai = deltac jmin = j END IF END IF END DO ! Mark the selected perturbed root. m(jmin) = 1 ! Compute the relative error. IF (r1/=0.0E0_nag_wp) THEN r3 = a02abf(zbar(1,jmin),zbar(2,jmin)) di = min(r1,r3) r(i) = max(deltai/max(di,deltai/rmax),eps) ELSE r(i) = 0.0_nag_wp END IF END DO WRITE (nout,*) WRITE (nout,99999) 'Degree of polynomial = ', n WRITE (nout,*) WRITE (nout,*) 'Computed roots of polynomial ', ' Error estimates' WRITE (nout,*) ' ', ' (machine-dependent)' WRITE (nout,*) DO i = 1, n WRITE (nout,99998) 'z = ', z(1,i), z(2,i), '*i', r(i) END DO 99999 FORMAT (1X,A,I4) 99998 FORMAT (1X,A,1P,E12.4,SP,E12.4,A,5X,SS,E9.1) END SUBROUTINE ex2