コンテンツへスキップ
Varligガイド
Varligホーム

高度な数学:機能と制限

このページでは、Varlig Calcの高度な数学機能(リスト、ベクトルと行列、複素数、総和と総乗、方程式の求解、微積分)をまとめます。機能ごとに、関数の働き、受け付ける値、答えの正確さ、制限を紹介します。答えが予想と違うときに、詳細を確認するために使ってください。

例を豊富に使った入門は、各ガイドを参照してください:リストと統計、ベクトルと行列、複素数、総和、方程式の解法、微積分。

概要

機能 例 答え
リスト [1, 2+3, 4*2] [1, 5, 8]
リストの項目 [10, 20, 30][1] 20
入れ子のリストの項目 [[1,2],[3,4]][1][0] 3
量の合計 sum([1 kg, 500 g]) 1.5 kg
統計 average([1,2,3]), median([5,1,3]) 2, 3
範囲(降順) range(5, 1, -2) [5, 3, 1]
リストの足し算 [1,2] + [3,4] [4, 6]
行列の積 [[1,2],[3,4]] * [[1,0],[0,1]] [[1, 2], [3, 4]]
逆行列 inverse([[1,2],[3,4]]) [[-2, 1], [1.5, -0.5]]
行列式 det([[1,2],[3,4]]) -2
転置 transpose([[1,2],[3,4]]) [[1, 3], [2, 4]]
連立一次方程式 solve_system([[2,1],[1,2]], [34,29]) [13, 8]
複素数の計算 (2+3i) * (2-3i) 13
複素数の平方根 sqrt(complex(-4,0)) 2i
最頻値 mode([1,2,2,3]) 2
パーセンタイル percentile([1,2,3,4],25) 1.75
母標準偏差 population_stddev([1,2,3,4]) 1.1180339887
範囲にわたる総和 sum(k^2, k, 1, 10) 385
範囲にわたる総乗 product(k, k, 1, 5) 120
方程式を厳密に解く solve(x^2 - 5x + 6 = 0) [2, 3]
範囲を指定して解く solve(x^2 = 4, x, 0, 3) 2
記号微分 differentiate(sin(x), x) cos(x)
ある点での微分係数 derivative(x^3, x, 2) 12
定積分 integrate(x^2, x, 0, 3) 9

リスト、行列、複素数は、通常の値として扱えます。名前を付けたり、自分で定義した関数に渡したりでき、前の行を編集すると再計算されます。

calc
平方和(n) = sum(k^2, k, 1, n)
平方和(3) 答え 14
先頭(項目) = 項目[0]
先頭([10, 20]) 答え 10
平方根(y) = solve(x^2 = y, x, 0, 10)
平方根(9) 答え 3

エンジンが保証すること

このページに書かれていることの背後には、1つの決まりがあります。計算には、Varligが責任を持てる答えが出るか、理由を述べるエラーが出るかのどちらかしかありません。厳密な計算から、もっともらしく見える数値に落とすことはありません。

答えがどこまで厳密か

計算のされ方 対象
厳密な分数 方程式の係数と一次方程式の解。判別式が平方数になる二次方程式の解。行列の +、-、*、数値との掛け算、transpose、det、inverse、rank、solve_system。median、mode、modes、percentile、quartile、および3つの分散すべて
小数の平方根 stddev、sample_stddev、population_stddev、およびそれ以外の二次方程式の解
2進浮動小数点 eigenvalues、qr、lu、svd、integrate、および引数が4つの solve

厳密とは、文字どおり厳密という意味です。行を読んでから答えを表示するまでの間に丸めは入らないので、厳密な答えは、名前を付けて保存し、また使っても厳密なままです。近似値のほうは、sqrt が返すのと同じ、誤差の範囲がわかっている小数です。表示される最後の桁まで正しく丸められているわけではないので、2つの近似値を == で比べるのは確かな判定になりません。solve(x^2 - 2 = 0) と sqrt(2) はどちらも 1.4142135624 と表示されますが、等しくありません。

1つの答えの中で両方が混ざることはありません。判別式が平方数にならない二次方程式では、2つの解はどちらも近似値です。

単位

演算 決まり
行列 ただの数値のみ。単位、金額、複素数の要素は受け付けません
方程式 両辺ともただの数値のみ
median、mode、modes、percentile、quartile、stddev、population_stddev 同じ次元でそろっているか、ただの数値。互換性のある単位は1つ目の値の単位で読まれ、答えもその単位になります
variance、sample_variance、population_variance ただの数値のみ。分散は観測値を2乗するので、どんな単位もそこで失われます

単位のある値とない値を混ぜると、裸の数値として黙って読むのではなくエラーになります。例外は昔から1つだけで、裸の 0 はほかの値の単位として数えられます。

断られるもの

次のどれも、数値も文章も返しません。いずれも、できないことと、代わりに書ける形があればその形を示すエラーになります。

  • 3次以上の多項式方程式、多項式でない方程式、割る数や指数の位置にある未知数、どちらも値を持たない2つの名前、未知数のない方程式、単位や金額を含む方程式。いずれも引数が4つの数値解版 solve を示します。
  • 実数解のない方程式は、複素数の解ではなくそう伝えます。どんな値でも成り立つ方程式も、その1つを返すのではなくそう伝えます。
  • 次元が合わない、または正方でない行列の演算、特異行列の逆行列、ただの数値でない要素。
  • 何も繰り返されないか複数の値が並んだ場合の mode、0から100を外れたパーセンタイル、0から4を外れた四分位数、空のリストに対する sum、product、count 以外の統計。

設計としてどこでもサポートしていないもの:多項式の係数をまとめる以上の記号的な式変形、非線形の連立方程式、実数方程式の複素数解、単位や金額の行列、記号積分、グラフの描画。

メッセージそのものはエラー、診断、制限に一覧があります。

リストと数学関数の書き方

  • 項目と引数はカンマで区切ります。 後ろにスペースがあるカンマは常に区切りになり、後ろにちょうど3桁の数字が続くカンマは桁区切りになるので、[1,200, 1,800] は2つの項目です。スペースを入れない場合は、[12,-51,4] のようにすべてのカンマが区切りになります。[1,234] のようにカンマがどちらの意味にも取れる場合は、両方の書き方がエラーに表示されます。小数には小数点を使います。
  • 行列は行のリストです。 [[1,2],[3,4]] のように書きます。[1,2;3,4] のようなセミコロンの省略記法はありません。
  • インデックスは0から始まります。 0以上の整数で指定してください。リストの末尾を超えるインデックスはエラーになり、先頭に戻ったり、範囲内に切り詰められたりすることはありません。
  • 引数の数はチェックされます。 sqrt(4,9) は推測で計算せず、エラーになります。

リストと統計

次の関数はリストを受け取ります:length または count、sum、product、average または mean、median、min、max、mode と modes、percentile と quartile、そしてばらつきの関数 variance、sample_variance、population_variance、stddev、sample_stddev、population_stddev。

  • mode が答えるのは、1つの値がはっきりと最も多いときだけです。同数で並んだ場合も、何も繰り返されないリストも、どちらも modes、median、average を示すエラーになります。modes は最も多い値をすべて返します。
  • percentile(list, rank) は0から100までの順位を受け取り、最も近い2つの順位の間を線形に補間します(両端を含む定義)。50パーセンタイルは中央値、0パーセンタイルと100パーセンタイルは最小値と最大値です。quartile(list, k) は0から4までの整数 k を受け取り、percentile(list, 25k) と同じです。
  • variance と stddev は標本用で、n - 1 で割り、値が2つ必要です。population_variance と population_stddev は n で割り、値は1つで足ります。sample_variance と sample_stddev は、短い名前の長い言い方です。
  • 空のリストの sum は0、product は1、count は0です。空のリストに対するそのほかの統計はエラーになります。
  • 同じ長さの2つのリストは、項目ごとに足し算と引き算ができます。リストに数値を掛けたり、リストを数値で割ったりでき、== で2つのリストを比べることもできます。
  • range(start, end, step) は両端を含みます。ステップは省略できます。
  • dot(a, b) は、2つの実数ベクトルの内積を求めます。
calc
支出 = [420, 385, 510, 460] 答え [420, 385, 510, 460]
sum(支出) 答え 1,775
average(支出) 答え 443.75
median(支出) 答え 440
支出[0] 答え 420
支出 * 1.1 答え [462, 423.5, 561, 506]
range(0, 1, 0.25) 答え [0, 0.25, 0.5, 0.75, 1]

リストの変換

呼び出し 答え 動作
sort([3,1,2]) [1, 2, 3] 単位のない数値を昇順に並べ替えます。等しい項目は元の順序を保ちます
reverse([1,2,3]) [3, 2, 1] どのリストでも逆順にします
unique([3,1,3,2]) [3, 1, 2] 各値の最初のものだけを残します。項目は単位も含めて完全に一致する必要があります
slice([10,20,30,40], 1, 3) [20, 30] 開始インデックスから、終了インデックスの手前までの項目を取り出します
map(x^2, x, [1,2,3]) [1, 4, 9] 各項目について式を計算します
filter(x > 1, x, [1,2,3]) [2, 3] 条件がtrueになる項目だけを残します
variance([1,2,3]) 1 正確な標本分散(個数から1を引いた数で割ります)
  • slice には、0 ≤ start ≤ end ≤ リストの長さ を満たす整数が必要です。それ以外の範囲はエラーになります。
  • variance には、単位のない数値が2つ以上必要です。
  • map と filter は、式、各項目に使う名前、リストの順に受け取ります。この名前は呼び出しの中でだけ有効なので、ほかの場所で定義した名前は変わりません。filter の式は、true または false を返す必要があります。

ベクトルと行列

ベクトルはフラットなリスト、行列は行のリストです。行列は長方形で、単位のない実数だけを含み、行数と列数が1〜32でなければなりません。

関数 動作
A * B 行列の積。Aの列数とBの行数が等しい必要があります
transpose(A) 行と列を入れ替えます
shape(A) [行数, 列数]
identity(n) n 行 n 列の単位行列
trace(A) 正方行列の対角成分の和
det(A) 正方行列の行列式
inverse(A) 正方行列の逆行列。特異行列はエラーになります
rank(A) 任意の長方形行列の階数(正確な消去法による)
dot(a, b) 同じ長さの2つのベクトルの内積
cross(a, b) 項目が3つの2つのベクトルの外積
solve_system(A, b) 正方行列 A とフラットなベクトル b について、A*x = b を解きます
eigenvalues(A) 実正方行列の固有値。複素数の組も含み、順序は決まっていません
qr(A) [Q, R](Q*R は A とほぼ等しい)
lu(A) [P, L, U](P*A は L*U とほぼ等しい)。正方行列のみ
svd(A) [U, s, Vt](s は特異値のフラットなリストで、A は U*diag(s)*Vt とほぼ等しい)

正確な結果: det、inverse、rank、solve_system は正確な分数を使います。rank には丸めの許容誤差がありません。solve_system は特異な連立方程式に対してエラーを返し、非線形の連立方程式や、解が無数にある連立方程式は扱いません。

近似の結果: eigenvalues、qr、lu、svd は浮動小数点数を使い、出力が有限であることを確認します。qr と svd は長方形行列を受け付け、コンパクトな(thin)分解を返します。固有値とSVDの計算は、10,000回の反復で停止します。表示される答えでは、最大の成分に比べて丸め誤差にすぎない成分は0と表示されますが、インデックスで取り出すと保存された値が返されます。条件の悪い行列では精度が落ちることがあるので、これらの結果を == で判定しないでください。

calc
# 大人2枚と子ども1枚で34、大人1枚と子ども2枚で29
solve_system([[2,1],[1,2]], [34,29]) 答え [13, 8]
det([[2,1],[1,2]]) 答え 3
rank([[1,2],[2,4]]) 答え 1

複素数

i は虚数単位です。ただし、i という名前やカスタム単位を定義した場合は除きます。

  • 関数: complex(real, imaginary)、real、imag、conj、abs、arg(ラジアン)、sqrt(主値)は、すべて複素数を受け付けます。
  • 正確さ: 実部と虚部、四則演算、整数乗は正確なままです。一般の累乗根と arg は近似値です。
  • 実数の結果: (2+3i) * (2-3i) のように虚部が打ち消し合うと、答えは通常の実数になります。-4 + 0i や complex(-4,0) のように複素数として書いた値は、-4 と表示されても、計算や名前を通じて複素数のままです。
  • 負の数の平方根と対数: sqrt(-4)、ln(-1)、log(-100) は実数の範囲で計算され、虚数のエラーを表示します。エラーには、代わりに書くべき複素数の形(sqrt(-4 + 0i) など)が示されます。その形か sqrt(complex(-4,0)) と書くと、2i になります。
  • 表示: 浮動小数点数の丸め誤差にすぎない部分は0と表示されるので、exp(i*pi) は -1 と表示されます。保存される値には桁が残っています。
  • 比較: < と > は、両方の虚部が0の場合にだけ使えます。
  • そのほかの関数: sin、cos、tan とその逆関数、双曲線関数とその逆関数、exp、ln、log または log10、log2、cbrt、小数乗や複素数乗は、すべて複素数を受け付けます。これらは浮動小数点数と主枝を使います。0の対数と、有限でない結果はエラーになります。
calc
(2+3i) * (2-3i) 答え 13
abs(3+4i) 答え 5
sqrt(-4 + 0i) 答え 2i
sqrt(complex(-4,0)) 答え 2i
sqrt(-4) 答え Error: imaginary number. For a complex answer, write sqrt(-4 + 0i)
exp(i*pi) 答え -1

総和と総乗

sum(expression, name, from, to) は、from から to まで(両端を含む)の各整数について式を計算し、足し合わせます。summation はその別名で、product は足す代わりに掛け合わせます。

  • 名前は呼び出しの中でだけ有効です。すでに定義した名前は変わらず、行がその名前に依存することもありません。
  • 総和や総乗の中に、別の総和や総乗を入れられます。
  • to が from より小さい場合、範囲は空になり、総和は0、総乗は1になります。
  • 1回の呼び出しで使える項は、最大10,000個です。
calc
sum(k^2, k, 1, 10) 答え 385
product(k, k, 1, 5) 答え 120
k = 7 答え 7
sum(k, k, 1, 3) 答え 6
k 答え 7

方程式を解く

solve(equation) は、未知数が1つで次数が1か2の多項式方程式を読み取り、その解を求めます。未知数は、方程式の中で値を持たない唯一の名前です。値を持つ名前はその量として読まれます。右辺は省略でき、その場合は式が0に等しいものとして扱われます。

  • 一次方程式は数値で答えます。二次方程式は、重複しない 実数解を昇順に並べたリストで答えるので、重解は要素が1つのリストになります。答えの形は、見つかった解ではなく、書かれた次数に従います。
  • 係数とその整理は厳密で、判別式が平方数になる場合は解も厳密です。それ以外の二次方程式では、2つの小数の平方根が返ります。
  • 両辺ともただの数値でなければなりません。単位、金額、複素数は受け付けません。
  • 実数解のない方程式は、複素数の解ではなく Error: no real solution になります。どんな値でも成り立つ方程式は、1つを選ぶのではなくそう伝えます。
  • そのほか(3次以上、多項式でない方程式、割る数や指数の位置にある未知数、値を持たない2つ目の名前)は、下にある引数が4つの形を示すメッセージとともに断られます。
calc
solve(2x + 6 = 10) 答え 2
solve(x^2 - 5x + 6 = 0) 答え [2, 3]
solve(x^2 - 2 = 0) 答え [-1.4142135624, 1.4142135624]
solve(x^2 + 1 = 0) 答え Error: no real solution

solve(expression, name, lower, upper) は別の関数です。lower から upper の間で式が0になる name の実数値を1つ求めます。solve(left = right, name, lower, upper) は、両辺が等しくなる値を求めます。

  • 境界は有限の数値で、lower は upper より小さくなければなりません。
  • 境界ちょうどにある根は受け付けられます。それ以外の場合、式は一方の境界で正、もう一方の境界で負になる必要があり、その間で連続している必要があります。
  • 探索では、ステップごとに区間を半分にします。128ステップ以内に、式が0から 1e-10 以内に収まり、区間が十分に狭くなれば成功です。確認した点で式が定義されていない場合や、探索が収束しない場合は、その行にエラーが表示されます。
  • 求めるのはすべての根ではなく、1つの根です。連立一次方程式には solve_system を使ってください。
calc
solve(1500 + 12*x = 20*x, x, 0, 1000) 答え 187.5
solve(x^2 = 2, x, 0, 2) 答え 1.4142135624

微積分

記号微分

differentiate(expression, name)(derivative(expression, name) とも書けます)は、導関数をテキストとして返します。

  • 単位のない実数の演算に対して、和、積、商、累乗の法則と連鎖律を使います。さらに sin、cos、tan、sinh、cosh、exp、ln、sqrt も扱えます。
  • 式に含まれるほかの名前は、ノートで値が定義されているかどうかに関係なく、定数として扱われます。differentiate(a*x^2, x) は (a*(2*(x^(2-1)))) になります。
  • 結果は簡約されず、8,192文字までに制限されます。
  • abs などのほかの関数はエラーになります。それらには、ある点での微分係数を使ってください。これは完全な数式処理システムではありません。
  • 導関数には、元の式と同じ定義域の制約があります。
calc
differentiate(sin(x), x) 答え cos(x)
differentiate(x^3, x) 答え (3*(x^(3-1)))

ある点での微分係数

derivative(expression, name, point)、または引数が3つの differentiate は、1つの点での傾きを数値的に求めます。精度を高めた中心差分を使い、片側の推定値と照らし合わせて確認します。式には自分で定義した関数も使えますが、その点の近くで滑らかで、単位のない実数を使っている必要があります。推定値が収束しない場合や、サンプルが定義されていない場合は、その行にエラーが表示されます。

数値的な形式では数値を求めるため、変数以外のすべての名前に値が必要です。これは、ある点での微分係数、sum、product、solve、integrate に当てはまります。値のない名前があると、Unsupported: Unknown name: の後にその名前が表示されます。

calc
derivative(x^3, x, 2) 答え 12
f(x) = x^2
derivative(f(x), x, 3) 答え 6
differentiate(a*x^2, x) 答え (a*(2*(x^(2-1))))
derivative(a*x^2, x, 3) 答え Unsupported: Unknown name: a

定積分

integrate(expression, name, lower, upper) は、2つの有限の境界の間で、式の下の面積を求めます。

  • 境界を入れ替えると答えの符号が変わり、境界が等しいと0になります。
  • 不等間隔の点でサンプリングする、適応型の7点・15点ガウス・クロンロッド則を使います。そのため、cos(128*pi*x) のような規則的な波にだまされません。integrate(cos(128*pi*x), x, 0, 1) は約 -1.3e-15 となり、丸め誤差の範囲で0です。
  • 誤差の推定値の合計が、答えの大きさの 1e-9 倍以下(答えが1より小さい場合は 1e-9 以下)になることを目指します。少なくとも2段階の細かさで比較し、丸め誤差を考慮したうえで、推定誤差が最も大きい部分から細分化します。
  • 細分化2,048回、分割20階層、またはその行のほかの高度な数学と共有する100,000ステップのいずれかに達すると停止します。制限に達した場合や、サンプルが定義されていない場合はエラーになります。
  • 誤差の推定値はよい目安ですが、保証ではありません。滑らかで有限の式を使ってください。スパイク、不連続点、速い振動を含む式では、結果が不正確になることがあります。
  • 不定積分と無限の境界には対応していません。
calc
integrate(x^2, x, 0, 3) 答え 9
integrate(x^2, x, 3, 0) 答え -9

数学関数の引数と単位

  • factorial は fact の別名、trunc は int の別名です。
  • sign は-1、0、1のいずれかを返します。atan2(y, x) は、ラジアン単位の角度を単位のない数値で返します。
  • round、floor、ceil の省略可能な2番目の引数は、小数点以下の桁数ではなく ステップ です。round(17, 5) は最も近い5の倍数に丸めます。小数点以下の桁数に丸める方法については、端数処理を参照してください。
  • 対数、指数関数、双曲線関数には、単位やお金を使えません。通常の三角関数は、30° のような角度を受け付けます。
  • 平方根と立方根は、単位の指数が割り切れる場合に単位を保持します。量の累乗も単位を保持します。摂氏や華氏の温度は、2乗したり根を取ったりできません。
calc
gcd(12, 18) 答え 6
round(17, 5) 答え 15
sin(30°) 答え 0.5
sqrt(9 m²) 答え 3 m
(2 kg)^2 答え 4 kg²

制限

制限は、答えを表示する前にチェックされます。

  • リストまたは range の項目は1,024個まで
  • 行列は32 × 32まで
  • 1つの sum または product の項は10,000個まで
  • リストと関数呼び出しの入れ子は16階層まで
  • 1行の高度な数学全体(入れ子の呼び出しを含む)で共有する100,000ステップ
  • 分数の分子または分母は4,096ビットまで(Varlig Calcのほかの部分と同じ)

制限に達すると、その行にエラーが表示され、ノートのほかの部分は引き続き動作します。途中までの合計、逆行列、収束していない根が答えとして表示されることはありません。すべての制限と答えの正確さについては、結果の読み方:表示と精度を参照してください。