コンテンツにスキップ

利用者:謎男/Maxima/1page

出典: フリー教科書『ウィキブックス(Wikibooks)』

具体的な使い方

[編集]

変数と定数

[編集]

Maximaでは、少数の予約語を除く英数字からなる語に、定数・変数(スカラー・ベクトル・行列)だけでなく、式、関数、演算子、事実、属性、文脈、lispのコマンドなどを割り当てたり、定義することができる。Maximaではこの様に広く対応する語をatom(原子)と呼ぶ。しかし、本書では数学に対応させてMaximaの解説をおこなうので、定数、変数、関数と場合により呼びわけることにする。

予約語
integrate next from diff in at limit
sum for and elseif then else do
or if unless product while thru step

割り当て

[編集]

変数に具体的数式を1対1で対応させる場合は、割り当て(assignment)をおこなう。

通常割り当て(:)

[編集]

:記号によって、左の変数に右の内容を割り当てる。 右が定数なら代入、多項式なら関数定義、方程式なら方程式に名前をつけたことになる。

置き換え割り当て(:=)

[編集]

基本的には:記号と同じであるが、左の変数(変数1,変数2,...)の変数1,変数2,...に右の式の変数1,...に対応するして、置き換えの機能を持つ。簡易な関数定義[1]になるが、置き換えられるまで右の式が評価されないので、注意しよう。


一覧(values)

[編集]

values()は現在具体的な実態を割り当てられ定義された文字の一覧を返す。

開放(kill)

[編集]

kill(変数名)は変数名に割り当てられた定義を消す。 kill(all)はすべての割り当てられた定義を消す。

変数序列と定数

[編集]

変数は複数ある場合、優先順位をつけることができる。優先順位の低い変数は分解されやすく、式の後ろの方にまわされる。Maximaでの変数序列は次のようになる。

  1. 主変数
  2. ordergrate宣言変数(変数1,変数2,..)
  3. その他変数(アルファベット逆順)
  4. orderless宣言変数(...,変数2,変数1)
  5. スカラー
  6. 定数
  7. 数字

ここで定数(constant)とは、他の変数の影響をまったく受けない不変の数のことである。

宣言(declare)

[編集]

declare(a1,属性1,a2,属性2,...)は、a1に属性1,a2に属性2,を付ける。変数の序列にかかわる属性としては、

  • mainvar - 主変数
  • nonscalar - ベクトルや行列、演算子に付けるもの
  • scalar - スカラーで積が交換可能
  • constant - 定数(%pi,%eと同じ)。

がある。

変数序列の変更(ordergrate,orderless)

[編集]
  • ordergrate(変数1,変数2,..)は変数の順位を上げる。
  • orderless(変数1,変数2,..)は変数を順位を下げる。
  • unorder(変数1,変数2,..)は変数の順位を普通にもどす。

序列・属性を確認する関数

[編集]
  • orderlessp(変数1,変数2)は変数1<変数2の順のときtrueを返し、
  • ordergreatp(変数1,変数2)は変数1>変数2の順のときtrueを返す。
  • scalarp(変数)は変数がスカラーの場合にtrueを返し、
  • constantp(式)は式が定数か定数の関数であるときにtrueを返す。

演習問題

[編集]

関連項目

[編集]
  1. ^ 利用者:謎男/Maxima/関数を定義する

マニュアル該当箇所

[編集]

複素数

[編集]

Maximaでは、複素数を扱うことができる。

複素数宣言

[編集]

Maximaの文字変数はすべて実数とみなされている。特に宣言を変えない限りは、虚数単位%iを含むもの、負の数の平方根を含むものが複素数として扱われる。

(%i1) sqrt(-5);
(%o1) 				  sqrt(5) %i
(%i2) a+%i*b+c+%i*d;
(%o2) 			      %i d + c + %i b + a

のように、多項式形式で複素数を表している。

宣言(declare)

[編集]

declare(文字, 属性,文字, 属性, ...)を用いると、その文字単独に、複素数、純虚数、実数といった属性をつけることができる。詳しくはMaxima/変数と定数を参照。

(%i1) declare(z, complex, i, imaginary, r , real);
(%o1) 				     done

変数の属性が違うといくらかの関数で挙動が変わってくる。ただ、すべての関数が正しく対応しているわけではないので注意が必要である。以下の節に出てくるz,i,rは上記の宣言を受けたものとして、例を紹介する。(ちなみにこれらを試したバージョンは5.10.0と5.11.0)

複素数特有の関数

[編集]

実部・虚部に分ける(realpart,imagpart)

[編集]

realpart(式)は複素数の実部拾い出す。またimagpart(式)は式の虚部を実数としてとりだす。

(%i2) c:a+b*%i;
(%o2) 				   %i b + a
(%i3) realpart(c);
(%o3) 				       a
(%i4) realpart(z);
(%o4) 				  realpart(z)
(%i5) realpart(r);
(%o5) 				       r
(%i6) realpart(i);
(%o6) 				  realpart(i)
(%i7) imagpart(c);
(%o7) 				       b
(%i8) imagpart(z);
(%o8) 				  imagpart(z)
(%i9) imagpart(r);
(%o9) 				       0
(%i10) imagpart(i);
(%o10)				  imagpart(i)
(%i11) realpart(c+z+i);
(%o11)			 realpart(z) + realpart(i) + a
(%i12) imagpart(c+z+i);
(%o12)			 imagpart(z) + imagpart(i) + b

この例を見てもわかるとおり、現在はあまりimaginary宣言された変数の対応が悪く、複素数と同じ扱いである。

複素共役(conjugate)

[編集]

conjugate(式)は式の複素共役を求める。

(%i2) c:a+b*%i;
(%o2) 				   %i b + a
(%i3) conjugate(c);
(%o3) 				   a - %i b
(%i4) conjugate(z);
(%o4) 				 conjugate(z)
(%i5) conjugate(i);
(%o5) 				      - i
(%i6) conjugate(c+z+i);
(%o6) 			  conjugate(z) - i - %i b + a
(%i7) conjugate(z)+z;
(%o7)                         conjugate(z) + z
(%i8) conjugate(z)*z;
(%o8)                          z conjugate(z)

imaginary宣言された変数の対応はconjugate()においては完璧であるが、共役との和・積をrealpart(),imagpart(),abs()には残念ながら変えてくれない。この後にrectform(%)としても、かなり奇妙な式が出てくる。

絶対値(abs)

[編集]

abs(式)は複素数の絶対値を求める。

(%i3) abs(c);
				       2    2
(%o3) 				 sqrt(b  + a )
(%i4) abs(z);
(%o4) 				    abs(z)
(%i5) abs(i);
(%o5) 				    abs(i)
(%i6) abs(c+z+i);
                                          2                                  2
(%o6) sqrt((realpart(z) + realpart(i) + a)  + (imagpart(z) + imagpart(i) + b) )
					    

実際は多項式に対して、abs(z)=sqrt(realpart(z)^2+imagpart(z)^2)を実行しているだけのようだ。

偏角(carg)

[編集]

carg(式)は複素数式を極形式にしたときの偏角を返す。

(%i1) y:a+b*%i;
(%o1)                             %i b + a

(%i2) carg(y);
(%o2)                            atan2(b, a)

(%i3) carg(r);
Is  r  positive, negative, or zero?

positive;
(%o3)                                 0

(%i4) carg(r);
Is  r  positive, negative, or zero?

negative;
(%o4)                                %pi

(%i5) carg(b*%i);
Is  b  positive, negative, or zero?

positive;
                                     %pi
(%o5)                                ---
                                      2

(%i6) carg(3*exp(%i*2));
(%o6)                                 2

この関数は(実数)と%i*(実数)にはうまく働いているが、

(%i7) carg(i);
Is  i  positive, negative, or zero?

negative;
(%o7)                                %pi

(%i8) carg(z);
Is  z  positive, negative, or zero?

positive;
(%o8)                                 0

のように、複素数宣言された変数にまったく未対応でとんでもない答えを返す。ちなみにこれらの仕様は公式マニュアルにもバグであると書かれている。atan2(b,a)は、偏角を求めるための拡張された逆接弦関数である。詳しくは利用者:謎男/Maxima/三角関数・双曲線関数を参照しよう。

形式変換

[編集]

直交形式化(rectform)

[編集]

(実数)+(純虚数)の形にまとめるには、rectform(式)を使う。 

(%i1) y:a+%i*b+c+%i*d;
(%o1)                        %i d + c + %i b + a

(%i2) rectform(y);
(%o2)                        %i (d + b) + c + a

(%i3) rectform(y+i+z);
(%o3) realpart(z) + %i (imagpart(z) + imagpart(i) + d + b) + realpart(i) + c
                                                                            + a

(%i4) rectform(y*z);
(%o4) %i ((d + b) realpart(z) + (c + a) imagpart(z)) + (c + a) realpart(z)
                                                          - (d + b) imagpart(z)

極形式化(polarform)

[編集]

(絶対値)*%e^(%i*(偏角))の極形式にまとめるには、polarform(式)を使う。多項式をひとつの項であらわそうとするので、よく考えて使わないと式がむしろ複雑になる。

(%i1) y:a+b*%i;
(%o1)                             %i b + a

(%i2) polarform(y);
                             2    2    %i atan2(b, a)
(%o2)                  sqrt(b  + a ) %e

(%i3) polarform(z);
Is  z  positive, negative, or zero?

positive;
(%o3)                                 z

(%i4) polarform(y*z);
                                          2                                  2
(%o4) sqrt((b realpart(z) + a imagpart(z))  + (a realpart(z) - b imagpart(z)) )
      %i atan2(b realpart(z) + a imagpart(z), a realpart(z) - b imagpart(z))
    %e

この極形式化は、結局直交形式で計算された後に実行される。(%o4)など、sqrt(a^2+b^2)*abs(z)*%e^(%i*(atan2(b,a)+carg(z))のほうが良い気がするのだが、そもそもcargの挙動がおかしいのでその期待もできない。そのため(%i3)など奇妙なことに、複素数zが正か負か?などと聞いてきたうえ、ぜんぜん極形式になってないないのは、おそらくcargの複素数宣言に対する対応のおかしさにあるのだろう。

行列形式化

[編集]

今のところ、そのような行列を作ってくれる手段はないようだ。

コーシー積分

[編集]

正則な複素関数の特異点を回る経路を積分すると2*%i*%pi*(留数)になり、含まない閉じた経路の積分は0である。

(%i1) f(z):=A/(z-%i);
                                          A
(%o1)                           f(z) := ------
                                        z - %i
(%i2) integrate(f(%i+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o2)                             2 %i %pi A
(%i3) integrate(f(-%i+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o3)                                  0
(%i4) integrate(f(1+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o4)                                  0
(%i5) integrate(f(-1+exp(%i*theta))*%i*exp(%i*theta),theta,0,2*%pi);
(%o5)                                  0

これはz=%iに留数Aを持つ関数f(x)を、%i, -%i, 1, -1を囲む単位円周回上を積分する例である。確かに留数が出てくる。

演習問題

[編集]

と置く。この時、曲線およびを通るように複素数と実数を定めよ。

解答

多項式・有理式

[編集]

多項式[1]とは、変数の整数次の多数の項で表される式のことである。有理式とは、分数形式で表される式で分母分子が多項式で表現されるものである。ゆえに多項式は、分母が1の時の有理式であると言うこともできる。ここでは、多項式の形式変換、分解、係数分離などを扱う。

多項式・有理式の表現

[編集]

多項式の表現は普通に四則演算で表現できる。指数は ^ 記号でも、** 表現でも表す事ができる。

(%i1) (x+3)*(2*x-1);
(%o1)                         (x + 3) (2 x - 1)
(%i2) 2*x^3-x**2-2*x+3;
                                 3    2
(%o2)                        2 x  - x  - 2 x + 3

有理式は、除算記号 / で分数同様に表現する。/ は除算記号で四則演算順序にしたがうので、有理式の場合分母をカッコで囲う必要がある。

(%i3) (x-3)*(x+3)/((2*x-6)*(-x+1));
                                (x - 3) (x + 3)
(%o3)                         -----------------
                               (1 - x) (2 x - 6)

式変形

[編集]

Maximaに入力した数式は、上記の様に入力しただけでは、同類項の加算ぐらいしか簡略化は行われない。最終型を得るためには、式変形する必要がある。

展開(expand)

[編集]

expand(多項式)は、多項式の積の展開を実行し、標準的な多項式表現にすることである。有理式に対しては分母・分子ともに展開を実行し、分子成分の項で有理式が多項分数式に展開される。約分は一切行われない。

(%i1) (x+3)*(2*x-1)-3*x+3;
(%o1)                    (x + 3) (2 x - 1) - 3 x + 3
(%i2) expand(%);
                                     2
(%o2)                            2 x  + 2 x
(%i3) expand((x-3)*(x+3)/((2*x-6)*(-x+1)));
                             2
                            x                  9
(%o3)                ---------------- - ----------------
                          2                  2
                     - 2 x  + 8 x - 6   - 2 x  + 8 x - 6

因数分解(factor)

[編集]

factor(多項式)は、多項式をできるだけ一次式の積の表現に分解[2]する。gfactor(多項式)は、多項式を複素数の領域まで因数分解する。有理式に対しては分母・分子ともに因数分解を実行し、約分も行う。多項式化している有理式も一度通分され、1つの分数式になる。

(%i1) x^4+2*x^2+1;
                                 4      2
(%o1)                           x  + 2 x  + 1
(%i2) factor(%);
                                    2     2
(%o2)                             (x  + 1)
(%i3) gfactor(%o1);
                                     2         2
(%o3)                        (x - %i)  (x + %i)
(%i4) (x^2+2*x-3)/(x^2-3*x+2);
                                 2
                                x  + 2 x - 3
(%o4)                           ------------
                                 2
                                x  - 3 x + 2
(%i5) factor(%);
                                    x + 3
(%o5)                               -----
                                    x - 2
(%i6) (2*x^2-4*x+6)/(x-3)-2*x;
                               2
                            2 x  - 4 x + 6
(%o6)                       -------------- - 2 x
                                x - 3
(%i7) factor(%);
                                  2 (x + 3)
(%o7)                             ---------
                                    x - 3

正則有理化(rat)

[編集]

rat(式)は有理式・多項式を正則有理化する。正則有理形式(CER)とは

  • 一つの分数式であること。
  • 分子と分母に公約多項式が無いこと。
  • 分母の最大次数項の係数が正の数であること。
  • 係数はすべて有理数であること。(小数も有理数に丸められる)

である。rat..(式)の式変形の関数はそのほか多数あるが、それらはすべて結果がCERになっている。

(%i1) (3/2*x^2-1/3*x-1/4)/(-1/3*x-4)-1*x;
                                 2
                              3 x    x   1
                              ---- - - - -
                               2     3   4
(%o1)                         ------------ - x
                                  x
                                - - - 4
                                  3
(%i2) rat(%);
                                   2
                               22 x  + 44 x - 3
(%o2)/R/                     - ----------------
                                   4 x + 48

rat...()を実行するとCER形式であることを示す符号/R/がつく。これが付いていると以後の正則有理化し続けようとする。符合を忘却するには、ratdisrep(式)を用いる。

(%i3) %o2-1/(4*x+48);
                                   2
                               11 x  + 22 x - 1
(%o3)/R/                     - ----------------
                                   2 x + 24
(%i4) ratdisrep(%o2);
                                   2
                               22 x  + 44 x - 3
(%o4)                        - ----------------
                                   4 x + 48
(%i5) %o4-1/(4*x+48);
                              2
                          22 x  + 44 x - 3      1
(%o5)                   - ---------------- - --------
                              4 x + 48       4 x + 48

またCRE形式にfactor(式),expand(式) を実行すると/R/符号を忘却してから、それらの式変形をする。(因数分解形式や展開形式はCRE形式になり得ないので。)

部分分数展開(partfrac)

[編集]

partfrac(式,変数)は部分分数展開[3]を行う。


代入・置き換え

[編集]

subst(代入する式,変数名,式)は(式)中の(変数)に(代入する式)を代入する。ratsubst(置き換える式,置き換えられる式,式)は(式)中の(置き換えられる式)に(置き換える式)を代入する。

分解

[編集]

分子・分母を取り出す

[編集]

num(有理式)は分子を返す。denom(有理式)は分母を返す。

各項をばらす・因子を分ける

[編集]

pickapart(式,深さ)は(式)を(深さ)ので分解し、それぞれに(%tn)のラベルを付ける。展開多項式の場合、深さ1で各項ごとに分けることができる。

係数

[編集]

coeff(有理式,変数名,次数)は、(有理式)から、(変数)の(次数)次項の係数を返す。(次数)は省略でき、その場合は1とされる。定数項を拾うのには、(次数)に0を入れる。

(%i1) ex:3*x^2+4*x-3;
                                  2
(%o1)                          3 x  + 4 x - 3
(%i2) coeff(ex,x,2);
(%o2)                                  3
(%i3) coeff(ex,x);
(%o3)                                  4
(%i4) coeff(ex,x,0);
(%o4)                                 -3

ただし、多変数の多項式の係数は、正しいが期待した通りにはならないことがある。

(%i5) ex:2*x^2+3*x*y-y^2-5*x+3;
                             2              2
(%o5)                    - y  + 3 x y + 2 x  - 5 x + 3
(%i6) coeff(ex,y);
(%o6)                                 3 x
(%i7) coeff(ex,x);
(%o7)                               3 y - 5
(%i8) coeff(ex,x*y);
(%o8)                                 0
(%i9) coeff(coeff(ex,x),y);              
(%o9)                                 3

多変数の場合は式(%i9)の様に、coeff(coeff(と繰り替えして、すべての変数に対して次数を指定するのが正しい。同様に定数項を拾うのにも、coeff(coeff(ex,x,0),y,0)が使える。また、これはdeclear(x,mainvar,y,constant)[4]などの宣言をしていても同様である。

DISPLAY2D:FALSE;
ex:2*x+3*y+z+4=0;
coeff(expand(rhs(solve(ex,z)[1])),x);
coeff(expand(rhs(solve(ex,z)[1])),y);
coeff(coeff(expand(rhs(solve(ex,z)[1])),x,0),y,0);

性質を特徴づける

[編集]

次数

[編集]

hipow(多項式,変数) lopow(多項式,変数)

変数のリスト

[編集]

listofvars(式)

演習問題

[編集]

関連項目

[編集]
  1. ^ w:多項式
  2. ^ w:因数分解
  3. ^ w:部分分数分解
  4. ^ Maxima/変数と定数#宣言(declare)

マニュアル該当箇所

[編集]

文脈と事実

[編集]

数学の問題の例文を用いて、文脈(Context)と事実(fact)を説明しよう。

a,tを実数として、とする。

  1. a=1, t=-2のとき、Aの逆行列を求めよ。
  2. a=0のとき、Aが逆行列を持つようなtの値をの範囲を求めよ。
  3. どのようなtに対しても、Aが常に逆行列を持つように、aの範囲を定めよ。
  4. Aはあるtの値に対しても、常に逆行列を持つことを示せ。

まず、初めの文から「a,tを実数として」という事実(fact)が加わる。また行列Aの定義も一つの事実である。これら事実の集合を文脈(context)という。ここで初めの文の文脈を文脈rootと名づけておこう。また、1.で新しい事実が加わるが(この加えた文脈を文脈1としておこう。)、2.では文脈rootの事実以外は忘れ去られる。(この文の時点の文脈を文脈2としておこう。)このとき、文脈rootは文脈1,文脈2の部分文脈(subcontext)といい、2.の時点で文脈1は不活性(inactive)で文脈2が活性(active)であるという。

事実操作

[編集]

宣言(declare)

[編集]

declare(a1,属性1,a2,属性2,...)は、a1に属性1,a2に属性2,を付ける。 変数・関数に指定できる事実の属性はfeatures()で確認できる。(それ以外にも属性はあるが、それはここでは書かない。) 属性は以下のようになっており、競合しない属性ならいくつもつけることができる。 またassume(kind(変数,属性))でも、宣言できる。

変数に対して
complex(複素数)[1]
real(実数)[1] imaginary(純虚数)[1] ×
rational(有理数) irrational(無理数) ×
integer(整数) noninteger(非整数) ×
even(偶数) odd(奇数) × ×

関数に対して[2]

  • 解析的 analytic
  • 引数の交換の対称性 commutative, symmetric(対称),antisymmetric(反対称)
  • 引数の再帰性 lassociative,rassociative
  • 返値に関すること posfun,integervaled
  • 関数の勾配の性質 incleasing,decleasing
  • 返値の偶奇性 oddfun,evenfun

事実確認(featurep)

[編集]

featurep(変数,属性)は変数に属性があるとき、trueを返す。

仮定(assume)

[編集]

assume(式)は「式が成り立つとする」といった仮定を現行の文脈に付加する。

事実一覧(facts)

[編集]
  • facts(変数)は変数に課された事実を一覧する。
  • facts()はいまの文脈で成り立つ事実を一覧する。

事実を消す(forget)

[編集]

forget(式)は式の仮定が成り立つ事実を消す。

文脈操作

[編集]

Maximaでは、起動時にglobalと、それを部分文脈を持つinitialの2つの空の文脈が作られる。どちらも不活性で、現行の文脈はinitialになっている。

新しい文脈を作る

[編集]
  • supercontext(文脈名,部分文脈)は新しい文脈を部分文脈(subcontent)の上に作る。
  • newcontext(文脈名)は新しい文脈をglobalを部分文脈として作った上、新しい文脈を活性化し、現在の文脈とする。

文脈を一覧する

[編集]
  • contexts()は文脈の一覧をリストで返す。
  • activecontexts()は活性化している文脈の一覧をリストで返す。

現行の文脈を変える

[編集]

contextの変数に現行の文脈が割り当てられている。現行の文脈を変えるときはこの変数に新しい文脈を割り当る。

文脈を活性化・不活性化する

[編集]
  • activate(文脈名)は文脈を活性化する。
  • deactivate(文脈名)は文脈を不活性化する。

文脈を消す

[編集]

killcontext(文脈名)は文脈を消す。ただし、globalは消せない。

演習問題

[編集]

関連項目

[編集]
  1. ^ 1.0 1.1 1.2 利用者:謎男/Maxima/複素数
  2. ^ 利用者:謎男/Maxima/関数を定義する

マニュアル該当箇所

[編集]

関数を定義する

[編集]

具体的関数の定義

[編集]

数式・条件式などを与え具体的な数字を返す関数の定義方法である。

置き換え割り当て(:=)

[編集]

関数名(変数1,変数2):=(式)は、視覚的にもわかりやすい関数定義法である。

(%i1) f(x,y):=(x^2+x*y)/y;
                                          2
                                         x  + x y
(%o1)                         f(x, y) := --------
                                            y
(%i2) f(0,1);
(%o2)                                  0
(%i3) f(a,1);
                                     2
(%o3)                               a  + a
(%i4) f(a,2);
                                    2
                                   a  + 2 a
(%o4)                              --------
                                      2

しかし、式の中に出てくる変数は、何もかも置き換えられてしまうので、時折不都合が出てくる。

(%i1) f(x):=diff(sin(x),x);
(%o1)                       f(x) := diff(sin(x), x)
(%i2) f(x);
(%o2)                               cos(x)
(%i3) f(%pi);
(%o3)                                  0
(%i4) cos(%pi);
(%o4)                                - 1
(%i5) diff(sin(%pi),%pi);
(%o5)                                 0

(%i3)のコマンドの答えは、通常なら(%o4)の結果を期待するであろうが、実際は(%i5)のようなコマンドと解釈されている。

定義(define)

[編集]

先のような問題を回避するためには、define(f(x),diff(sin(x),x))で関数の定義を行う。

(%i1) define(f(x),diff(sin(x),x));
(%o1)                          f(x) := cos(x)
(%i2) f(%pi);
(%o2)                                - 1

また置き換え割り当てでは、f(x):=%;のような関数定義はできないのだが、define(f(x),%);ならできる。

(%i1) (x+2*y)^2;
                                          2
(%o1)                            (2 y + x)
(%i2) f(x):=%;
(%o2)                             f(x) := %
(%i3) f(1);
(%o3)                             f(x) := %
(%i4) define(f(x),%o1);
                                              2
(%o4)                        f(x) := (2 y + x)
(%i5) f(1);
                                          2
(%o5)                            (2 y + 1)

ローカル変数の使用(block)

[編集]

関数の定義をプログラム言語のように長くなると、その関数の内部処理だけに使う変数がほしくなってくる。たとえ、その関数の外側で同名の変数があったとしても、関数内部ではまったく独立した変数として扱われる変数をプログラム言語ではローカル変数と言うが、Maximaでもローカル変数を用いることができる。

block([変数1,変数2,...], 処理1, 処理2, ...)の変数1,2は、blockの(と)の間だけで有効なローカル変数となる。blockの返値は、カンマで区切られた処理の一番最後の式の値である。

抽象的関数の定義

[編集]

数式ではなく、性質だけを与える関数の定義法である。 まだ、解けてない関数や数式を特定しない一般的な関数を与える場合に使う。

性質の付加(declare)

[編集]

declare(関数1,属性1,関数2,属性2,...)は関数に属性を与える。

featureの属性[1]
[編集]
  • analytic - 解析的
  • 引数の交換の対称性

commutative, symmetric(対称) antisymmetric(非対称)

  • 引数の入れ子性

lassociative rassociative

  • 返値に関すること

posfun integervaled

  • 関数の勾配の性質

incleasing decleasing

  • 返値の偶奇性

oddfun evenfun

featureじゃないが関数の重要な属性
[編集]

線形性 liner,outative,additive

積算性 multiplicative


依存関係を与える(depends)

[編集]

depends(y,x)

演習問題

[編集]

関連項目

[編集]
  1. ^ 利用者:謎男/Maxima/文脈と事実

マニュアル該当箇所

[編集]

三角関数・双曲線関数

[編集]

Maximaでは、以下の関数・逆関数が定義されている。

atan2とatanの違い
関数種 通常 その逆関数
三角関数 sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
atan2(y,x)
割三角関数 csc(x)
sec(x)
cot(x)
acsc(x)
asec(x)
acot(x)
双曲線関数 sinh(x)
cosh(x)
tanh(x)
asinh(x)
acosh(x)
atanh(x)
割双曲線関数 csch(x)
sech(x)
coth(x)
acsch(x)
asech(x)
acoth(x)

角度の単位はラジアン(radian)で、円周率%piを用いてあらわすことができる。atan2(y,x)は座標(x,y)の極座標変換などの際に、プログラム言語等で良く用いられる偏角を求める関数

(ここでsgn(y)はyの符号を返す関数)のことで、値域(-%pi,%pi]を返す関数である。(図およびMaxima/複素数#偏角(carg)参考)

簡略化

[編集]

三角関数は通常は関数として扱われ、特に指示しない限り簡略化が行われない。

(%i1) sin(x)/cos(x);
                                    sin(x)
(%o1)                               ------
                                    cos(x)

自動的に簡略化される場合

[編集]

引数に%pi/6の整数倍の定数項がある場合は、自動的に簡略化される。 引数が%iの項だけの場合は三角関数と双曲線関数の変換が行われる。

(%i1) sin(%pi/2);
(%o1)             1;

(%i2) sin(x+%pi/2);
(%o2)             cos(x);

(%i3) cos(%i*x);
(%o3)             cosh(x);

三角関数それぞれの係数をまとめる(trigsimp)

[編集]

trigsimp(式)を用いると、

  • 三角関数ごとの項にまとめられる。
  • sin2(x) + cos2(x) = 1などの単純化が施される。
(%i1) trigsimp(1-sin(x)^2);
                                       2
(%o1)                               cos (x)

(%i2) trigsimp(1+tan(x)^2);
                                       1
(%o2)                               -------
                                       2
                                    cos (x)

(%i3) (a*sin(x)-b*cos(x))^2+(a*cos(x)+c*sin(x))^2;
                                    2                        2
(%o3)          (c sin(x) + a cos(x))  + (a sin(x) - b cos(x))

(%i4) expand(%);
       2    2       2    2
(%o4) c  sin (x) + a  sin (x) + 2 a c cos(x) sin(x) - 2 a b cos(x) sin(x)
                                                        2    2       2    2
                                                     + b  cos (x) + a  cos (x)

(%i5) trigsimp(%);
                                           2    2     2       2    2
(%o5)    (2 a c - 2 a b) cos(x) sin(x) + (b  - c ) cos (x) + c  + a

引数を外に展開する(trigexpand)

[編集]

trigexpand(式)は、加法定理・倍角公式などを用いて、引数を関数外に展開する。

(%i1) trigexpand(sin(x+y));
(%o1)                    cos(x) sin(y) + sin(x) cos(y)

(%i2) trigexpand(cos(x+y));
(%o2)                    cos(x) cos(y) - sin(x) sin(y)

(%i3) trigexpand(tan(x+y));
                                tan(y) + tan(x)
(%o3)                          -----------------
                               1 - tan(x) tan(y)

(%i4) trigexpand(sin(2*x));
(%o4)                           2 cos(x) sin(x)

三角関数の積を極力へらし、引数内に収める(trigreduce)

[編集]

trigreduce(式)は、

  • 三角関数の積・自乗などを、半角・積和公式などを用いて引数に収める。
  • sin(x)/cos(x)=tan(x)など三角関数間の変換が行われる。

積分前準備や周波数解析などに便利。

(%i1) trigreduce(sin(x)*cos(y));
                            sin(y + x)   sin(y - x)
(%o1)                       ---------- - ----------
                                2            2

(%i2) trigreduce(1/cos(x));
(%o2)                               sec(x)

指数関数表式にする(exponentialize)

[編集]

exponentializeフラグがtrueの時、三角関数・双曲線関数は指数関数で表されるようになる。初期状態はfalseである。

(%i1) exponentialize:true;
(%o1)                                true
(%i2) sin(3*x);
                                 3 %i x     - 3 %i x
                           %i (%e       - %e        )
(%o2)                    - --------------------------
                                       2
(%i3) cosh(x);
                                    x     - x
                                  %e  + %e
(%o3)                             -----------
                                       2

ただし、逆三角関数は対数関数表式になることはない。

(%i4) acos(cos(x));
                                  %i x     - %i x
                                %e     + %e
(%o4)                      acos(-----------------)
                                        2
(%i5) exponentialize:false;
(%o5)                               false
(%i6) acos(cos(x));
(%o6)                                 x

逆三角関数の簡略化

[編集]

現時点のMaximaでは、逆三角関数・逆双曲線関数の簡略化は、引数によく知られている定数が代入されている時、1対1対応する三角関数が代入されているときに限られている。

(%i1) atan(1/sqrt(3));
                                     %pi
(%o1)                                ---
                                      6
(%i2) atan(tan(x));
(%o2)                                 x
(%i3) asin(sin(x));
(%o3)                                 x
(%i4) asin(cos(x));
(%o4)                           asin(cos(x))

引数内をどうにか対応させると簡略化が行われる。

(%i5) asin(2*sin(x)*cos(x));
(%o5)                       asin(2 cos(x) sin(x))
(%i6) trigreduce(%);
(%o6)                                2 x

逆に三角関数の引数に逆関数があるときはよく対応する。

(%i7) cos(asin(x));
                                          2
(%o7)                           sqrt(1 - x )

ただし、(%o7)の簡略化はどのような場合も正しいが、(%o2)と(%o3)の簡略化は-%pi/2 < x < %pi/2の場合以外は間違いである。そのため、このような簡略化を制御するために、triginversesフラグが用意されている。

triginversesの値 実行される簡略化
all(初期値) sin(asin(x)) -> x
asin(sin(x)) -> x
true sin(asin(x)) -> x
false 簡略化禁止

微分・積分

[編集]

微分・積分公式が適用される。ただし計算結果は全く簡略化されていないので、後で簡略化を行うべきである。

(%i1) diff(asin(x));
                                    del(x)
(%o1)                            ------------
                                           2
                                 sqrt(1 - x )

(%i2) diff(sinh(x),x);
(%o2)                               cosh(x)

(%i3) diff(sin(x)+cos(3*x)-tan(x^2),x);
                              2  2
(%o3)                - 2 x sec (x ) - 3 sin(3 x) + cos(x)

(%i4) integrate(sin(2*x),x);
                                    cos(2 x)
(%o4)                             - --------
                                       2

(%i5) integrate(tan(2*x),x);
                                 log(sec(2 x))
(%o5)                            -------------
                                       2

(%i6) integrate(sin(x),x,0,1);
(%o6)                             1 - cos(1)

(%i7) integrate(1/sqrt(2-x^2),x);
                                      2 x
(%o7)                            asin(----)
                                       3/2
                                      2

多項式化

[編集]

三角関数を変数に置き換える。ratsubst(置き換える変数の多項式,置き換えられる関数,式)を用いる。

(%i1) cos(x)^4 + cos(x)^3 + cos(x)^2 + cos(x) + 1;
                     4         3         2
(%o1)             cos (x) + cos (x) + cos (x) + cos(x) + 1
(%i2) ratsubst(t, cos(x), %);
                          4    3    2    
(%o2)                    t  + t  + t  + t + 1

ただし、この例ではsin(x),tan(x)は同時に置き換えてくれない。

cos(x)をsin(x)に置き換える事もできる。これも置き換える数式が間違っていても強制的に置き換えるので注意。(この例もcos(x)<0の時には正しくない。)

(%i3) ratsubst (sqrt(1 - sin(x)^2), cos(x), %o1);
              2    2           2    3/2               2          2
(%o3) (1 - sin (x))  + (1 - sin (x))    + sqrt(1 - sin (x)) - sin (x) + 2

演習問題

[編集]

関数が最大値を取るときの、を求めよ。ただしである。

解答

関連項目

[編集]

Wikipedia

[編集]

外部リンク

[編集]

複素数

[編集]

まず、問題文の定義を入力する。

(%i1) declare([a,b,r],real,z,complex);
(%o1)                                done
(%i2) z[1]:5+6*%i;
(%o2)                              6 %i + 5
(%i3) z[2]:3+2*%i;
(%o3)                              2 %i + 3
(%i4) alpha:a+b*%i;
(%o4)                              %i b + a
(%i5) eq1(z):=abs(z-alpha)=r;
(%o5)                    eq1(z) := abs(z - alpha) = r

まず、eq1はabsが面倒なのでまず両辺自乗する。

(%i6) eq2(z):=eq1(z)^2;
                                            2
(%o6)                          eq2(z) := eq1 (z)

複素数zの集合は円周にである。通る3点で円は一意に決まるので、3点を代入して、

(%i7) eq3:eq2(z[1]);
                                  2          2    2
(%o7)                      (6 - b)  + (5 - a)  = r
(%i8) eq4:eq2(z[2]);
                                  2          2    2
(%o8)                      (2 - b)  + (3 - a)  = r
(%i9) eq5:eq2(%i);
                                     2    2    2
(%o9)                         (1 - b)  + a  = r

a,b,rの解を求めれば良い。

(%i10) solve([eq3,eq4,eq5],[a,b,r]);
(%o10)         [[a = 0, b = 6, r = 5], [a = 0, b = 6, r = - 5]]

r>0のはずなので解は、

(%i11) %o10[1];
(%o11)                       [a = 0, b = 6, r = 5]

である。とあっさり方程式を解かれては面白くないので、検算がてらに、自分で方程式を解いてみる。eq3,4,5式からr^2を消して2変数にする。

(%i12) eq6:rat(eq3-eq5);
(%o12)/R/                   - 10 b - 10 a + 60 = 0
(%i13) eq7:rat(eq4-eq5);
(%o13)/R/                    - 2 b - 6 a + 12 = 0

さらに、bを消して

(%i14) rat(eq6-5*eq7);
(%o14)/R/                          20 a = 0
(%i15) %/20;
(%o15)/R/                            a = 0

eq7にこれを代入する。

(%i16) ratsubst(0,a,eq7);
(%o16)                           12 - 2 b = 0
(%i17) rat((%-12)/(-2));
(%o17)/R/                            b = 6
(%i18) subst([a=0,b=6],eq5);
                                          2
(%o18)                              25 = r
(%i19) sqrt(%);
(%o19)                               5 = r

よって、Maximaの解いた答えは正しかった。

解答 α=6i, r=5

注意:(%i5),(%i6)で関数に方程式を代入するという変な事をしているのは、初めにeq1:abs(z-alpha)=r;で定義すると、zを代入した後、realpart(5+4*%i)などが計算されないという変なバグにぶちあたってしまったがためである。うまい宣言があると言う方は是非、この解答を書き換えて欲しい。

三角関数・双曲線関数

[編集]

まず問題文の関数を代入する。簡略表機のための代りにxを用いている。

(%i1) f1:sin(%pi/2-x)*sin(x)/(sin(%pi/2-x+alpha)*sin(alpha));
				 cos(x) sin(x)
(%o1) 			   -------------------------
			   sin(alpha) cos(x - alpha)

すでに、かなり簡略化が行われ見やすくなっている。最高値を探すため、微分して0となる点を求める事にする。その前に展開を行った方が後で方程式が解きやすくなる。

(%i2) trigexpand(%);
				cos(x) sin(x)
(%o2) 	      --------------------------------------------------
	      sin(alpha) (sin(alpha) sin(x) + cos(alpha) cos(x))

(%i3) diff(%,x);
				2
			     sin (x)
(%o3) - --------------------------------------------------
	sin(alpha) (sin(alpha) sin(x) + cos(alpha) cos(x))
			   2
			cos (x)
 + --------------------------------------------------
   sin(alpha) (sin(alpha) sin(x) + cos(alpha) cos(x))
   cos(x) sin(x) (sin(alpha) cos(x) - cos(alpha) sin(x))
 - -----------------------------------------------------
						       2
    sin(alpha) (sin(alpha) sin(x) + cos(alpha) cos(x)) 

乱雑であるが、試しに解いてみる。

(%i4) solve(%,x);
				       1/3	       1/3
		 (sqrt(3) %i cos(alpha)	   - cos(alpha)	  ) cos(x)
(%o4) [sin(x) = -------------------------------------------------, 
					      1/3
				  2 sin(alpha)
				 1/3		 1/3
	   (sqrt(3) %i cos(alpha)    + cos(alpha)   ) cos(x)
sin(x) = - -------------------------------------------------, 
					1/3
			    2 sin(alpha)
		   1/3
	 cos(alpha)    cos(x)
sin(x) = --------------------]
		      1/3
	    sin(alpha)

解けた!最後の実数解が本題の答えである。これをさらに簡略化していく。

(%i5) %o4[3]/cos(x);
					       1/3
			    sin(x)   cos(alpha)
(%o5) 			    ------ = -------------
			    cos(x)	       1/3
				     sin(alpha)
(%i6) trigreduce(%);
					       1/3
(%o6) 			    tan(x) = cot(alpha)
(%i7) x=atan(rhs(%o9));
					     1/3
(%o7) 			    x = atan(cot(alpha)   )

が解である。途中方程式を強引に解いてしまったが、

(%i8) factor(%o3);
				   3		        3
		     sin(alpha) sin (x) - cos(alpha) cos (x)
(%o8) 	     - ---------------------------------------------------
								 2
	       sin(alpha) (sin(alpha) sin(x) + cos(alpha) cos(x))

のように、比較的簡単な三次式であった。

解答: