McCalを使って、多項式の計算と方程式を解を求める方法について解説します。
多項式(整式)は、一つの変数の非負の指数乗の定数倍の項の和、差からなる式です。たとえば、変数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の変数を表しています。
これまでの例では、多項式の係数を決める一次元配列データとして、角かっこを用いていました。係数データを持つ変数を渡した場合は、標準的なMcCal関数の表示方法を使います。
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]
配列の要素データを見るには、
ボタンを押してインスペクタを起動します。
あるいは、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):