コンテンツへスキップ
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
範囲にわたる総和 sum(k^2, k, 1, 10) 385
範囲にわたる総乗 product(k, k, 1, 5) 120
方程式を解く 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

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

  • 項目と引数はカンマで区切ります。 後ろにスペースがあるカンマは常に区切りになり、後ろにちょうど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 または countsumproductaverage または meanmedianminmaxstddev(標本標準偏差)。

  • 空のリストの 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つ以上必要です。
  • mapfilter は、式、各項目に使う名前、リストの順に受け取ります。この名前は呼び出しの中でだけ有効なので、ほかの場所で定義した名前は変わりません。filter の式は、true または false を返す必要があります。

ベクトルと行列

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

関数 動作
A * B 行列の積。Aの列数とBの行数が等しい必要があります
transpose(A) 行と列を入れ替えます
shape(A) [行数, 列数]
identity(n) nn 列の単位行列
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*RA とほぼ等しい)
lu(A) [P, L, U]P*AL*U とほぼ等しい)。正方行列のみ
svd(A) [U, s, Vt]s は特異値のフラットなリストで、AU*diag(s)*Vt とほぼ等しい)

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

近似の結果: eigenvaluesqrlusvd は浮動小数点数を使い、出力が有限であることを確認します。qrsvd は長方形行列を受け付け、コンパクトな(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)realimagconjabsarg(ラジアン)、sqrt(主値)は、すべて複素数を受け付けます。
  • 正確さ: 実部と虚部、四則演算、整数乗は正確なままです。一般の累乗根と arg は近似値です。
  • 実数の結果: (2+3i) * (2-3i) のように虚部が打ち消し合うと、答えは通常の実数になります。-4 + 0icomplex(-4,0) のように複素数として書いた値は、-4 と表示されても、計算や名前を通じて複素数のままです。
  • 負の数の平方根と対数: sqrt(-4)ln(-1)log(-100) は実数の範囲で計算され、虚数のエラーを表示します。エラーには、代わりに書くべき複素数の形(sqrt(-4 + 0i) など)が示されます。その形か sqrt(complex(-4,0)) と書くと、2i になります。
  • 表示: 浮動小数点数の丸め誤差にすぎない部分は0と表示されるので、exp(i*pi)-1 と表示されます。保存される値には桁が残っています。
  • 比較: <> は、両方の虚部が0の場合にだけ使えます。
  • そのほかの関数: sincostan とその逆関数、双曲線関数とその逆関数、explnlog または log10log2cbrt、小数乗や複素数乗は、すべて複素数を受け付けます。これらは浮動小数点数と主枝を使います。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 は足す代わりに掛け合わせます。

  • 名前は呼び出しの中でだけ有効です。すでに定義した名前は変わらず、行がその名前に依存することもありません。
  • 総和や総乗の中に、別の総和や総乗を入れられます。
  • tofrom より小さい場合、範囲は空になり、総和は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(expression, name, lower, upper) は、lower から upper の間で式が0になる name の実数値を1つ求めます。solve(left = right, name, lower, upper) は、両辺が等しくなる値を求めます。

  • 境界は有限の数値で、lowerupper より小さくなければなりません。
  • 境界ちょうどにある根は受け付けられます。それ以外の場合、式は一方の境界で正、もう一方の境界で負になる必要があり、その間で連続している必要があります。
  • 探索では、ステップごとに区間を半分にします。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) とも書けます)は、導関数をテキストとして返します。

  • 単位のない実数の演算に対して、和、積、商、累乗の法則と連鎖律を使います。さらに sincostansinhcoshexplnsqrt も扱えます。
  • 式に含まれるほかの名前は、ノートで値が定義されているかどうかに関係なく、定数として扱われます。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つの点での傾きを数値的に求めます。精度を高めた中心差分を使い、片側の推定値と照らし合わせて確認します。式には自分で定義した関数も使えますが、その点の近くで滑らかで、単位のない実数を使っている必要があります。推定値が収束しない場合や、サンプルが定義されていない場合は、その行にエラーが表示されます。

数値的な形式では数値を求めるため、変数以外のすべての名前に値が必要です。これは、ある点での微分係数、sumproductsolveintegrate に当てはまります。値のない名前があると、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

数学関数の引数と単位

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

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