多項式の計算・方程式の解

McCalを使って、多項式の計算と方程式を解を求める方法について解説します。

多項式(Polynomial)について

多項式(整式)は、一つの変数の非負の指数乗の定数倍の項の和、差からなる式です。たとえば、変数xの4次の多項式は、

  a4x4 + a3x3 + a2x2 + a1x + a0

と表すことができます。ここで、a4 ~ a0が多項式の係数です。

 

多項式の取り扱い方法

McCalでは、各項の係数を降順にならべた一次元配列を用いて、多項式を扱う関数を持ちます。

たとえば、一次元配列の値を持つ変数 p = [1,0,-2,-5]を用いて次の多項式

  p(x) = x3 - 2x - 5

を表します。変数の2乗の項がない場合は、対応する係数に0を指定していることに注意してください。

 

下の例では、特定のxの値に対応する、多項式の値を計算する関数#polyVal()を使っています。

p(1) = -6 であることを示しています。

McCalにおいて多項式を扱う関数は、#polyで始まる関数名を持ち、FunctionViewerの"System Function"→"多項式"の項目の下にまとめてあります。

 

多項式の自然表示

先ほどの例では、右下に多項式の自然表示が現れています。

McCalでは、多項式の変数として慣例的に文字'x'を使います。'x'の色は黒、また多項式を黒の線で囲んで表示します。

黒色のxを使うのは、多項式の変数と、McCalの変数を区別するためです。以下の例では、白色の'x'は、McCalの変数を表しています。

poly2

これまでの例では、多項式の係数を決める一次元配列データとして、角かっこを用いていました。係数データを持つ変数を渡した場合は、標準的なMcCal関数の表示方法を使います。

poly1

 

方程式の解をもとめる

McCalは、方程式の解を求める#polySolv() 関数を持っています。この関数は、多項式の係数配列を渡すと、その多項式方程式の解を配列として返します。係数に複素数が含まれていても対応します。

として、次の方程式の解を求めてみます.

  2x5 -13x4 + 22x3 = 28x2 + 40x - 25

まず、右辺がゼロの形、f(x) = 0 に変形します。

  2x5 -13x4 + 22x3 - 28x2 - 40x + 25 = 0

次に左辺の多項式の係数を#polySolv()関数に渡せば、方程式の解を配列の形(array[5])で返します.

#polySolv([2, -13, 22, -28, -40, 25])
  ▶︎ array[5]
  
insp-solv-ss

 

配列の要素データを見るには、 <Ins>  ボタンを押してインスペクタを起動します。

insp-solv

 

あるいは、Print コマンドを使っても可能です。

 Print #polySolv([2, -13, 22, -28, -40, 25])
▽-1.000 ▽0.500 ▽1.000 -2.000i ▽1.000 +2.000i ▽5.000  
  ▶︎ array[5]

 

方程式の解の検証

実際に、解を元の多項式に代入した場合、値がゼロになるか検証してみましょう。

 p = [2, -13, 22, -28, -40, 25]

多項式の係数を変数に記憶させておいて、あとで使えるようにしておきます。次に下のように、方程式の解を変数'a'に保存します。

 a = #polySolv(p)
  ▶︎ array[5]
 Print a
 ▽-1.000 ▽0.500 ▽1.000 -2.000i ▽1.000 +2.000i ▽5.000 

それぞれの解について、多項式に代入した場合の値を #polyVal()を用いて計算します。#polyVal()の第二引数に配列を渡した場合、各要素に対する評価値を同じサイズの配列で返します。

 Print #polyVal(p, a)
 ▽ 0 ▽0 ▽0 +0i ▽0 ▽ -9.202E-13 
 ▶︎ array[5]

おおよそ 10-12 ~ 10-14程度の計算誤差を含んでいますが、すべての解について、評価値がほぼ0になっています。

 

方程式の解の検証2

先ほどの例では、-1, 1/2, 5が解に含まれているように推定できます。従って、元の多項式は、(x+1)(2x-1)(x-5)で割り切れるか試してみます。関数#polyMul()は、可変数の引数のそれぞれを多項式とみなして、その積を計算します。関数#polyDiv()は、二つの引数を多項式とみなして、割り算を行い、商と余りを返します。

 Print #polyDiv(p, #polyMul([1,1],[2,-1][1,-5]))
 ▽1  ▽-2  ▽5
 ▶︎ array[3], 0

返り値の配列[1, -2, 5]は、次の多項式を表していることがわかります。その解は、1±2i です。また余りはゼロで、割り切れることを示しています。

  x2 -2x + 5

 

多項式を扱う関数の紹介

McCalにおいて多項式を扱う関数は、#polyで始まる関数名を持ち、FunctionViewerの"System Function"→"多項式"の項目の下にまとめてあります。この章では、簡単な紹介を記載します。

多項式の値 #polyVal(p,x): p(x)の値を返します。xが配列の場合、xと同じサイズで各要素が p(xi)である配列を返します。

多項式の四則演算 #polyAdd(a, b), #polySub(a, b), #polyMul(a, b), #polyDiv(a, b): このうち、割り算#polyDiv() は、商と余りの二つの多項式を返します。

多項式の方程式の解を求める #polySolv(p):

多項式の微分 #polyDer(p):