方程式解くのがクッソ苦手でも、コンピュータで方程式を解くためのツールというのが存在するので、大抵のものは自分のようなバカでも自動で解くことができる。
Maxima は Common-Lisp で書かれた数式処理ツールで、方程式を解くこともできる。例えば以下のように
(%i96) assume(C > 0, L > 0); (%o96) [C > 0, L > 0] (%i97) solve([ (2 * %pi * f * L = 1 / (2 * %pi * f * C))], [f]); 1 1 (%o97) [f = - ---------------------, f = ---------------------] 2 %pi sqrt(C) sqrt(L) 2 %pi sqrt(C) sqrt(L) (%i98) tex(%); $$\left[ f=-{{1}\over{2\,\pi\,\sqrt{C}\,\sqrt{L}}} , f={{1}\over{2\, \pi\,\sqrt{C}\,\sqrt{L}}} \right] $$ (%o98) false
(負のやつが出てくるのはどうしたらいいのかわからない。f > 0 を assume しても消えない)
また、出てきた方程式は tex(%oNN) とすると tex 記法にできて、そのまま使える (手直しが必要な場合も多いけど)
数学ができない僕みたいな人間にとってはこの程度の使い方でも死ぬほど便利だと思う。プログラムを書いてるとしばしば方程式を解いて使う場面があって、そういうとき試行錯誤なしにパツイチで求める式が出てくるのはうれしい。
問題は数式を Maxima の式になおすとこなのですこしだけメモ。演算子, ベーシックな関数
式 | 例 |
---|---|
y = 2 * x | |
2^n | |
sqrt(2) | |
%pi | |
%e^(-t / (C * R)) | |
sum(2 * n, n, 1, k) |
simplify_sum
sum をとにかく計算したいときは
$ load(simplify_sum); $ simplify_sum(sum(2 * n, n, 1, k));
ってやると
ってでてくる。便利すぎる。
log10
log10 はなぜか定義されていないので
log10(x) := log(x) / log(10)
してあげる必要がある。面倒だから最初から定義されていてほしい。
assume()
よくある、一部変数の値の範囲を仮定できる。一回定義したのは forget(定義) で消せる。全部消したいときは forget(facts()) で消せる。