数学的背景
AをN×Nの実数行列、Nの実数のbaベクトル、xaのベクトルNの未知の実数とします。行列方程式はAx = bです。
ヤコビの方法は次のとおりです。A= D + Rを分解します。ここで、Dは対角行列で、Rは残りのエントリです。
初期推測解x0を作成する場合、改善された解はx1 = inverse(D)*(b-Rx)です。ここで、すべての乗算は行列ベクトル乗算で、inverse(D)は逆行列です。
問題の仕様
- 入力:完全なプログラムは、次のデータを入力として受け入れる必要があります:行列A、ベクトルb、初期推測x0、および 'エラー'数e。
- 出力:プログラムは、最新のソリューションが実際のソリューションと最大でe異なるように、最小の反復回数を出力する必要があります。これは、絶対的な大きさのベクトルの各成分が最大でe異なることを意味します。反復にはJacobiの方法を使用する必要があります。
データの入力方法は選択できます。コマンドラインでの独自の構文である可能性があります。ファイルから入力を選択することができます。
データの出力方法は任意です。ファイルに書き込み、コマンドラインに表示、ASCIIアートなど、人間が読み取り可能なものであれば何でも記述できます。
詳細
真の解決策は与えられません。真の解決策の計算方法は完全にあなた次第です。たとえば、Cramerのルールによって解決することも、逆関数を直接計算することもできます。重要なのは、反復と比較できる真のソリューションがあることです。
精度が問題です。一部の人々の比較のための「正確な解決策」は異なる場合があります。このゴルフの目的のために、正確な解は小数点以下10桁まで正確でなければなりません。
明確にするために、現在の反復ソリューションの1つのコンポーネントでさえ、真のソリューションの対応するコンポーネントをeだけ超えている場合は、繰り返し続ける必要があります。
Nの上限は、使用しているハードウェアと、プログラムの実行に費やす時間によって異なります。このコードゴルフでは、最大N = 50を想定しています。
前提条件
プログラムが呼び出されたとき、次のことが常に成り立つと考えることができます。
- N> 1およびN <51。つまり、スカラー方程式は与えられず、常に行列方程式が与えられます。
- すべての入力は実数のフィールド上にあり、決して複雑になることはありません。
- 行列Aは常にメソッドが真の解に収束するようなものであるため、e以下のエラー(上記で定義)を最小化するための反復回数を常に見つけることができます。
- Aはゼロ行列でも恒等行列でもありません。つまり、1つの解があります。
テストケース
A = ((9, -2), (1, 3)), b = (3,4), x0 = (1,1), e = 0.04
真の解決策は(0.586、1.138)です。最初の反復では、x1 =(5/9、1)が得られます。これは、真の解と0.04以上、少なくとも1つのコンポーネントが異なります。別の反復を行うと、x2 =(0.555、1.148)が(0.586、1.138)と0.04未満しか異なりません。したがって、出力は
2
A = ((2, 3), (1, 4)), b = (2, -1), x0 = (2.7, -0.7), e = 1.0
この場合、真の解は(2.2、-0.8)であり、初期推測x0にはすでにe = 1.0未満の誤差があるため、0を出力します。つまり、反復を行う必要がない場合は、単に出力します
0
提出評価
これはコードゴルフであり、すべての標準的な抜け穴はここでは禁止されています。最短の正しい完全なプログラム(または関数)、つまり最小のバイト数が勝ちます。必要な多くのステップを1つの関数にまとめるMathematicaのようなものを使用することはお勧めしませんが、必要な言語を使用してください。