グラム・シュミット計算機
独立なベクトルを入力すると、同じ空間の正規直交基底が得られます。(1, 1, 0)、(1, 0, 1)、(0, 0, 3)は互いに直交する長さ1の3本になり、1本目は最初のベクトルを長さ1に縮めたものです。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
Gram-Schmidt 過程は、線形独立なベクトル集合を受け取り、正規直交基底を返します。同じ本数のベクトルで、それぞれ長さが 1 で互いに直交し、元のベクトルとまったく同じ部分空間を張ります。ベクトルを貼り付ければ、ブラウザ上でステップごとに正規直交基底が計算されます。ベクトルが線形従属の場合は、誤った答えを返す代わりにその旨をエラーとして通知します。
Gram-Schmidt 過程が実際に行うこと
正規直交基底を使えば、線形代数のほぼすべての計算が楽になります。射影は内積になり、座標の計算は自明になり、数値誤差も小さく抑えられます。Gram-Schmidt 過程は、任意の独立なベクトル集合からそのような基底を作ります。
まず最初のベクトルを長さ 1 に再スケーリングし、それを最初の基底ベクトルとします。それ以降の各ベクトルについては、すでに得られた各基底ベクトル方向の成分(内積として計算される射影)を差し引き、残りを再び長さ 1 にスケーリングします。その残りは、作り方上、それ以前のすべてのベクトルに直交します。
これを全ベクトルに繰り返せば、同じ部分空間を張る正規直交基底が得られます。このページの計算機は、まさにこの古典的な手順を実行します。同じ次元の数値配列としてベクトルを入力すると、対応する順序で正規直交ベクトルが返されます。
最初の出力ベクトルは最初の入力ベクトルを正規化したもので、それ以降の出力は入力のうち真に新しい成分を単位長にしたものです。計算はすべて倍精度の単純な算術なので、同じ入力からは常に同じ出力が得られ、自動化パイプラインに安全に組み込めます。
線形従属が結果ではなくエラーになる理由
入力ベクトルが線形従属の場合、Gram-Schmidt 過程には意味のある答えがありません。あるベクトルが先行するベクトルの線形結合なら、射影を差し引くとそのベクトルは完全に消え、正規化すべきものが残りません。長さゼロの残りで割ることは無意味です。
そのベクトルを黙って落としたり、ゼロ行を返したりする計算機は、入力の本数と合わない基底を渡し、モデル化の誤りを隠してしまいます。エラー呼び出しは課金されません。この検査は、ゼロベクトル、重複ベクトル、空間の次元を超える本数(数え上げだけで従属)といった明白なエッジケースも捕捉します。
許容誤差は厳密ではなく数値的なものなので、測定ノイズでほぼ従属になった集合も検出されます。独立なはずの集合でエラーが出た場合、メッセージが検査すべきベクトルを示すので、データ中の重複行やコピー&ペーストのミスをたいてい見つけられます。
実用上の詳細:入力形式、精度、上限
内側の配列 1 つが 1 ベクトルに対応し、すべて同じ次元で、最大 50 ベクトル・次元最大 50 までです。出力は次元、生成された正規直交ベクトルの本数、および単位ベクトルの配列としての基底を返します。成分は小数点以下 6 桁に丸められるため、結果はマシン間で安定し、比較や保存に安全です。
返される各ベクトルはユークリッドノルム 1 で、その丸めの範囲で他のベクトルと直交します。計算量は O(n²×次元) で、この上限規模では数マイクロ秒の処理なので、観測されるレイテンシは実質的に算術ではなく転送のものです。送信前の簡単な確認として、ゼロベクトルを含めない、同じベクトルを重複させない、ベクトル数が次元を超えないことを確かめてください。
本格的な数値計算で条件数の悪い集合を扱う場合は、修正 Gram-Schmidt や Householder による QR 分解の方が安定ですが、この計算機が受け付けるサイズでは、古典的過程でも出力する 6 桁の精度を大きく上回る正確さがあります。
活用例
グラフィックスやシミュレーションで方向ベクトルを直交化する
回転を合成する前に、ほぼ直交したフレームベクトルを真の正規直交基底に変換し、丸め誤差の蓄積を防ぎます。
最小二乗法や射影処理のための基底を準備する
毎回連立方程式を解く代わりに、正規直交基底ベクトルとの内積でデータを部分空間へ射影します。
宿題や教材の例題を検算する
手計算の Gram-Schmidt 演習をステップごとに検算し、従属の場合にどのベクトルが独立性を崩すかを正確に確認します。
よくある質問
どのような入力を受け付けますか?
有限の数値の配列の配列で、内側の配列 1 つが 1 ベクトル、すべて同じ次元、最大 50 ベクトル・次元最大 50 までです。
結果の精度はどのくらいですか?
成分は倍精度で計算され、小数点以下 6 桁に丸められます。各出力ベクトルは単位ノルムを持ち、その丸めの範囲で他のベクトルと直交します。
入力ベクトルの順序は結果に影響しますか?
はい。 最初の出力ベクトルは最初の入力を正規化したもので、以降の出力は同じ順序で直交化された残差です。入力を並べ替えると、別の(同様に正しい)正規直交基底が得られます。
ベクトルが線形従属のときはどうなりますか?
計算を止め、新しい方向を加えていないベクトルがどれかを知らせます。そのベクトルを黙って外したり、ゼロの行を返したりはしません。ゼロベクトルや重複したベクトルも従属として扱います。
正規直交基底は何に役立ちますか?
線形代数の計算のほとんどが簡単になります。射影は内積だけで求まり、座標もすぐに分かり、数値計算の誤差も小さく抑えられます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/math/gram-schmidt \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vectors":[[1,1,0],[1,0,1],[0,0,3]]}'const res = await fetch("https://api.kit.forhosting.com/math/gram-schmidt", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vectors": [
[
1,
1,
0
],
[
1,
0,
1
],
[
0,
0,
3
]
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/gram-schmidt",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vectors": [
[
1,
1,
0
],
[
1,
0,
1
],
[
0,
0,
3
]
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/gram-schmidt", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vectors":[[1,1,0],[1,0,1],[0,0,3]]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vectors":[[1,1,0],[1,0,1],[0,0,3]]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/gram-schmidt", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"vectors": [
[
1,
1,
0
],
[
1,
0,
1
],
[
0,
0,
3
]
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.gram_schmidt",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_vectors | 50 |
max_dimension | 50 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
API を呼び出せば、スクリプトやスプレッドシートのパイプライン、数値計算ワークフローの中でベクトル集合を直交化できます。
線形従属が結果ではなくエラーになる理由
このエンドポイントは従属を契約違反として扱います。各ベクトルが新しい方向を持つかを順に検査し、ベクトル k が先行ベクトルの張る空間に含まれる場合は、そのベクトルを特定する invalid_input エラーを返します。
実用上の詳細:入力形式、精度、上限
入力は vectors という単一のフィールドで、有限の数値の配列の配列として指定します。
技術的な質問
料金はいくらですか?
API 経由ではリクエストごとに $0.002 です。このページでは同じコードがブラウザで無料で動作します。
ベクトルが線形従属の場合はどうなりますか?
先行ベクトルの張る空間に含まれる最初のベクトルを特定する invalid_input エラーで失敗します。エラー呼び出しは課金されません。
複素ベクトルに使えますか?
いいえ。実ベクトルのみ受け付けます。成分は有限の JSON 数値である必要があります。