Document 603718

Mapleの使い方(3)
担当: 荻田 武史
今回やること
•  前回の続き •  数学関数 – 三角関数、指数・対数関数 •  プログラミング – 用語、関数、繰り返し文 積分(1)
•  積分するには定積分、不定積分ともにintコ
マンドを使用する。 •  Mapleの不定積分では、任意定数は解に含
まれない。 int(数式, 変数): 指定した変数で不定積分を
行う。 int(数式, 変数 = 下限..上限): 指定した変数
と区間で定積分を行う。 積分(2)
•  複数回積分する場合はintコマンドをさらに
入力する必要がある。(微分のdiffとは違う
ので注意!) int(int(数式, 変数1), 変数1): 指定した変数で
2回積分する。 Int(数式, 変数): 積分を計算しない数式の形
式のまま扱う。微分同様、value(変数)で解を
求めることが出来る。 積分(3)
•  微分同様、区分関数の積分をすること
ができる。 変数A = piecewise(区間1, 値1or関数1, 区
間2, 値2or関数2): 区分関数を定義する。 int(変数A, 変数x): 区分関数の変数Aを
変数xで積分する 積分(4)
入力
説明
int(x^2, x); x^2を積分する(不定積分)
int(x^2, x=1..3); x^2を1≦x≦3の区間で 積分する(定積分)
int(x^2, x=a..b);
積分範囲に変数を 指定することもできる
peq := piecewise(x<0, sin(x), cos(x)); 区分関数peqを定義 int(peq, x);
区分関数peqを積分する
積分(5)
入力
説明
deq := Int(x^2+x, x); value(deq); 積分を計算しない形式で表示
deqの解を求める
int(ln(x), x); log(x)の不定積分
int(int(ln(x), x), x); log(x)をさらに積分する
極限(1)
•  極限を行うには、limitコマンドを使用す
る。 limit(数式, 変数=値, オプション): (変数)
が(値)に近づくときの(数式)の極限値を計
算する。(※無限大はinfinityと記述する) オプションにrightまたはleKを指定すること
で右極限、左極限を求めることができる。 極限(2)
•  入力して確認してみよう 入力
limit(sin(x)/x, x=0); eq := (2*x^2+x-­‐3)/(x^2-­‐2*x+1); limit(eq, x=infinity); 説明
sin(x)
lim
x→0 x
limit(1/x, x=0, right);
2x 2 + x − 3
lim
2
x→∞ x − 2x +1
右極限を求める
limit(1/x, x=0, leK);
左極限を求める
級数展開(1)
•  級数展開するにはseriesコマンドを使用
する。 series(数式, 変数=展開点): 6次までの多
項式に級数展開する。 series(数式, 変数=展開点, 次数): 指定し
た次数まで展開する 級数展開(2)
入力
説明
eq1 := series(sin(x), x=0); sin(x)を級数展開
eq2 := series(sin(x), x=0, 8); 8次までの多項式に級数展開
↓級数展開した結果のグラフを作成する↓ peq1 := convert(eq1, polynom); plotの前にconvertで剰余項を
取り除く必要がある
plot(peq1, x=-­‐4..4);
plotする
数値積分(1)
•  数値積分とは・・・与えられた関数の定
積分の値を数値的に求める。 evalf(Int(数式, 範囲)): 数値積分を行う その他、様々な数値積分の手法を指定す
ることができる。 数値積分(2)
入力
evalf(Int(sin(x), x=0..1)); 説明
sin(x)の0≦x≦1の範囲の積分
を数値的に求める
evalf(Int(eq1, x=0..1, digits=20, 指数関数法
method=_Dexp)); evalf(Int(eq1, x=0..1, digits=20, ガウス求積法
method=_Gquad));
evalf(Int(eq1, x=0..1, digits=20, ニュートン・コーツ法
method=_NCrule));
常微分方程式
•  常微分方程式を入力するには diff コマ
ンドを使用する。 dsolve(微分方程式, 求める関数): 微分
方程式を解く 入力
説明
deq := diff(f(x), x); d
f (x) と入力する
dsolve(deq, f(x)); f(x)を求める dx
常微分方程式の一般解(1)
•  微分方程式の初期条件等の条件を指定し
ない場合、任意定数を含む一般解を求める。 •  必要な条件を定義することで任意定数を含
まない一般解を求めることができる。 dsolve({微分方程式, 初期条件}, 求める関数): 初期条件を定義して任意定数を含まない一般
解を求める。 常微分方程式の一般解(2)
入力
説明
deq := diff(f(x), x) = x*f(x); 微分方程式を定義する
ini := f(0) = 1; 初期条件iniを定義する
sol1 := dsolve({deq, ini}, f(x)); 初期条件を使用して 微分方程式を解く
sol2 := dsolve({deq, ini}, numeric);
numericオプションを指定すると
数値解を求めることができる
sol2(1.5);
適当な値を入力して 解を確認してみる
偏微分方程式
•  偏微分方程式を入力するには、常微分
方程式同様 diff コマンドを使用する。 psolve(微分方程式, 求める関数): 微分
方程式を解く 入力
説明
pdeq := diff(f(x,y), x); ∂
を入力
f (x, y)
psolve(pdeq, f(x,y)); f(x,y)を求める ∂x
偏微分方程式の一般解(1)
•  偏微分方程式は pdsolve コマンドで求めること
ができる。 •  変数分離のヒントを与えることで他の解を求め
ることもできる。 •  buildオプションで解を組み立てた形式で求める pdsolve(微分方程式, 求める関数, ヒント, build) : 偏微分方程式を解く 偏微分方程式の一般解(2)
入力
説明
pdeq1 := diff(f(x,y), x) = 4*diff(f(x,y), y); 偏微分方程式を定義
する ∂ ∂
f (x, y) = 4 f (x, y)
∂x
∂y
pdsolve(pdeq1, f(x,y)); 偏微分方程式を解く
pdsolve(pdeq1, f(x,y), HINT=g(x)+h(y), build);
変数分離のヒントを 与えて解く 偏微分方程式の数値解
入力
pdeq2 := diff(f(x,t), x) = -­‐0.3*diff(f(x,t), t); 説明
偏微分方程式を定義
ini2 := {f(x,0)=sin(x), f(0,t)=-­‐sin(t)}; x,tの初期条件を定義
pds1 := pdsolve(pdeq2, ini2, numeric, ]me=t, range=0..1);
numericオプションを指定して実行
(モジュール形式で出力)
p1:=pds1:-­‐plot(t=0, color=red): p2:=pds1:-­‐plot(t=1,color=blue): p3:=pds1:-­‐plot(t=2,color=green): plots[display](p1, p2, p3); tが変化するときの 2次元プロットを作成
pds1:-­‐plot3d(t=0..1, axes=boxed); 3二次元プロットを作成
三角関数(1)
•  三角関数を使うときは、単位はラジアン
を使用し、sin(ラジアン)のようにする。 入力
説明
Ang := 180; 角度が180度の場合
sin(Ang); これではダメ sin(Ang*Pi/180); ラジアンに直す cos(2*Pi); tan(1/6*Pi); 三角関数(2)
入力
説明
arcsin(1/2); 逆関数を求めることもできる
arccos(1/2); arctan(sqrt(3)); simplify(sin(x)^2+cos(x)^2, trig); 簡単化するにはsimplifyコマ
ンドにtrigオプションを指定
eq := expand(cos(x+y)); 式を展開する combine(eq, trig); 元に戻すにはcombineコマ
ンドにtrigオプションを指定 指数関数
•  指数関数は exp を使って表す exp(x): eのx乗を計算 exp(整数or有理数): 厳密に計算する exp(小数): 近似計算する 入力
説明
exp(2); 2
を厳密に計算
e
exp(2.0); 近似計算
対数関数
•  対数関数は log または ln を使って表す log(x)、ln(x): log x を求める log[底の値](値): 対数関数の底の値を指
定する 入力
説明
log(2); ln(2); log2を厳密に計算
log(2.0); ln(2.0); log2を近似計算
log[4](256); log 4 256
プログラミング 用語
変数: 数値や文字などを入れる箱のよう
なもの。扱われるデータを一定期間記憶し
て必要なときに利用出来る 引数: 関数などを呼び出すときに渡す値 戻り値: プログラム中の関数などが処理
を終了し、処理の結果として返す値 プログラミング 関数(1)
•  自分で独自の関数を定義することが
できる。 •  x の関数 sin(x) を f と名付けf(x) = sin(x) と定義したいとき、 -­‐>(ハイフ
ン+不等号)を使って f := x -­‐> sin(x); と書く。 プログラミング 関数(2)
•  2変数の関数も同様に定義すること
ができる。 •  x と y の関数sqrt(x^2 + y^2) を g と名
付け、g(x, y) = sqrt(x^2 + y^2) と定義
したいとき g := (x, y) -­‐> sqrt(x^2 + y^2); と書く。 プログラミング 関数(3)
•  実際に入力して確かめてみよう。 入力
説明
f := x -­‐> sin(x); f = sin(x) を定義する
f(1/2*Pi); g := (x,y) -­‐> sqrt(x^2 + y^2); g(0.5, 0.1); g = sqrt(x^2 + y^2) を定義する プログラミング 関数(4)
入力
説明
f1 := exp(x) * sin(x); 式を定義(≠関数)
f2 := x -­‐> f1; f2(0); 計算されない!
•  一度計算した結果を関数として再利用する
ときは unapply コマンドを使って関数を作
ることができる。 h := unapply(関数, 変数); プログラミング 関数(5)
入力
説明
f1 := exp(x) * sin(x); f1式を定義
f3 := unapply(f1, x); 関数f3(x) = f1式を定義 f3(0); 正しく計算される h := unapply(diff(sin(x), x), x); sin(x)をxで微分した結果を 関数hとして定義する h(1/3*Pi); プログラミング プロシージャ(1)
•  プロシージャ(手続き) proc による定義をするこ
とで、複数の計算などをひとつにまとめることが
できる。 変数 := proc(引数1, 引数2, ... , 引数n) 数式; end proc; とまとめて書く(shiK + returnで改行できる)。 変数(引数1, 引数2, … , 引数n); で呼び出し、処理結果を返す。 プログラミング プロシージャ(2)
•  プロシージャの内部だけで使用可能な変数
(局所変数)を用意することができる。 プロシージャの中で local 変数; と宣言することで使用できる。 ※proc内部で定義した局所変数は、外部から
利用することが出来ないので注意。 プログラミング プロシージャ(3)
入力
説明
f := proc(x,y,z) x^2 + y^2 + z^2; end proc; プロシージャを定義
f(1,2,3); 引数を指定して プロシージャを呼び出す プログラミング プロシージャ(4)
入力
説明
g := proc(eq, n) local t; t := expand((1-­‐eq)^n); return(t); end proc; localで変数tを宣言。 return(t)とすることで、戻り値を
tに指定することができる。 g(x, 2); g(x+y, 3); t; proc内部の局所変数tは 外部から使用できない。 プログラミング 繰り返し文(1)
•  パラメータ(変数)を動かしながら計算する場合
は、 for 文を使う。 for 変数 from 数1 to 数2 do 変数を数1〜数2まで 1ずつ増やしながら ここに書かれた処理を繰り返す end do; 数2の後に by 数3 を追記することで、繰り返しのス
テップ幅(刻み幅)を変更出来る。 プログラミング 繰り返し文(2)
•  例えば1から10までの合計を求めたい場合は
下のようにまとめて書く。(shiK + returnで改
行できる。end doまで書いてからreturnで実
行) 入力
s := 0; for k from 1 to 10 do s := s+k; end do プログラミング 繰り返し文(3)
•  一行目:合計を入れる変数s(初期値は0)をつ
くる。 •  二行目:変数kが1から10になるまで、forとend
の間(三行目)を繰り返す。 •  三行目:sをs+kで上書きする(10回繰り返す)。
kは繰り返すたびに1ずつ勝手に増えるので、
sは最終的に1から10の合計になる。
プログラミング 繰り返し文(4)
入力
説明
s := 0: for k from 1522 to 1533 do s := s+k; end do 1522から1533までの合計を求
める s := 0: for k from 1 to 10 by 2 do s := s+k; end do 刻み幅を2に変えて、 1から10の間の 奇数の合計を求める プログラミング 繰り返し文(演習)
•  0から30までの偶数の合計をfor
文を使って求めてみよう。 •  3から50までの3の倍数の積をfor
文を使って求めてみよう。