数値計算


電卓として使う[top]

Mathematica を電卓として使う.
直前の計算結果を受け取る場合は % 記号を使う.
割り切れない計算結果の数値解を求めるときは,N 関数を使う.

平方根の計算
小数点以下6桁以下の数が含まれる平方根では,その小数は,そのままでは切り捨てられる.
これを防ぐには,N[式,有効桁数]で指定する.有効桁数は,小数点以下の桁数を指定する.
また,Sqrt[2]を計算すると,答えはそのままの形で返す.これはルート2は厳密値でこれ以上簡単にならないから.近似値として数値を表示させる場合は,これもN関数を使う.

対数計算
自然対数の計算はLog を使う.計算は次のように行う.
Log[x]  eを底とする自然対数の計算.
Log[a, x] a を底とする x の対数.自然対数の場合は e を使う.
対数の計算で数式で求められない場合は,数値を求めるN関数を使う.

有効桁数

○小数の有効桁数は何も指定しなければ6桁.小数点以下6桁まで表示する.有効桁数を指定するには N[式, 有効桁数] で指定

(注意)計算の途中で,例えば 0.025 という少数を使っていると,上の有効桁数は機能しない.そのような場合は,0.025の代わりに,25/1000 と表記するか,

  0.025`10 

のように表記する. `10 の部分が10桁を表す.

初期設定の Precision[ ]は16桁

指数計算

分数の計算
分数式の計算の例.よく使う関数としては,
Together[] : 通分してまとめる
Apart[]: 簡単な分母からなる分数式の和にかえる
Cancel[]: 約分
ExpandNumerator[]: 分子を展開する
ExpandDenominator[]: 分母を展開する
ExpandAll[]: 分子,分母を展開する
分数の入力には / を使う.例 2/3
分数の掛け算は * かスペースを1つ入れる.例 1/2 2/3
分数の割り算のときは,各分数をかならず ( ) でくくる.例 (1/2)/(2/3)

○分数の計算で商と余りを求める.
商を求める関数は Quotient[ ]
余りを求める関数は Mod[ ]
基本関数だけを使う場合は,商と余りを別々に求めることになる.

関数定義を応用すると,式の形で求めることができる.

siki[a_,b_]:=
Print[a," = ",b," * ",Quotient[a,b]," + ",Mod[a,b]]siki[1996,8]

方程式の解き方[top]

○方程式を解くにはSolve関数を使う.
    Solve[方程式,未知数]
ここで注意は,方程式は == で表されること.x^2 + x + 2 == 0 のように.

○すべての方程式がきれいに解がもとまるとは限らない.5次以上の方程式は厳密に解けないことが知られている.このような場合は数値解を求める NSolve を使う.NRootsもある.NRootsは多項式方程式の数値解を求める.

○一般の方程式の数値解には,FindRoot が使える.

○Solveでも連立方程式を求めることができるが, 組み込み関数 LinearSolveの方が効率がよい.

(まとめ)
Solve:変数についての(連立)方程式を解く.解は置換のルール(->)のリストの形で返す.方程式が未知数以外の変数を含むときは定数とみなされる.
    Solve[ 方程式,未知数]
NSolve:多項式でかかれた(連立)方程式の数値解を返す
    NSolve[ 方程式,未知数]

Roots:多項式方程式の厳密解をえることができるときに解を返す.分解された解の形で返す.Rootsは1つの多項式方程式しか扱えない.
  Roots[ 方程式,未知数]

NRoots:多項式方程式の数値解
  NRoots[ 方程式,未知数]

LinearSolve:行列方程式として与えられている連立方程式系を解く
LinearSolve[m, b] は行列方程式 m x ==b をみたす x を返す.

FindRoot :より一般的な方程式系の数値解.非多項式方程式(代数方程式ではない non-algebraic)の数値解を求める.解を探索する.ニュートン法を用いて解を求める.
FindRoot[ 方程式,{未知数,初期値}]

FindRoot とLinearSolveが難しい.FindRootは解があるかどうかを試行錯誤しながら求める.LinearSolve は行列の知識が必要.

SolveやRootsで厳密解がない場合は ToRules[式]やRoots[式]の形で返す.その場合は,% //N で数値解を求めることができる.

(基本方針)
1.通常の方程式の場合,まずは Solve でやる.
2.厳密解がでない場合は,NSolveを使う.あるいは,Solve の後に % //N
3.5次以上の方程式の場合は最初から,NSolve
4.連立方程式でも,基本的には Solveでよい.
5.行列表現のときは,LinearSolve
6.非線形の場合や,解があるかどうか探索するときは,FindRoot

【課題】年利率10%で銀行に10万円を預金すると,この10万円は1年後には110,000円になり,2年後には121,000円になり,3年後には133,100円になるというように増えていくものとします(複利の計算).このとき,預金が100万円になるのは何年後でしょうか.

(ヒント)FindRootを使う例です.方程式が非線形なのでSolveやNSolveは使えません.
p = 10;
r = 0.1;
ganrigokei = 100;
Plot[{p (1 + r)^n, 100}, {n, 0, 30}];
FindRoot[p (1 + r)^n == ganrigokei, {n, 1}]

連立方程式の解き方[top]

○連立方程式も基本は Solve関数

○連立方程式は,方程式をリストとして与える.未知数もリストとして与える.リストとは{ , , }のようにくくられた数値の組

連立方程式の解の組は //TableForm でみやすくなる.

○連立方程式を求めるには 組み込み関数 LinearSolveが効率がよい.行列表現で解く方法.
LinearSolve の使い方.
行列方程式は M . X == B のようにかく."." は行列の掛け算のオペレータ.M は係数行列,X は未知数,B は定数項.以下のように,X のリスト X = {x, y, z} はかかなくてもよい.行列方程式の解は{x, y, z} のようにx, y, z のリストとして返す.

M = {{1, 3, -2}, {1, -2, 1}, {3, -1, -1}};
B = {1, 3, 8};
LinearSolve[M, B]

関数の定義[top]

関数を定義するには :=  さらに,左辺の引数にはアンダースコア _ (Shift を押しながらマイナスキーを押す.JISキーボードでは右のshiftキーの左隣の「ろ」のキー)
関数名そのものも引数にすることができる.

a = 2
a + 7

f[x_]:= x^2
f[3]

f[c+d]

f[1+x]

f[f[1+x]]

[top] [Mathematicaへ戻る]


Mail to: sasayama@kumagaku.ac.jp
Copyright(C) Kumamoto Gakuen University