2

私は物理学の学生です。データのリストに対して単純な緩和ループを実行する必要があり、次のような単純な while ループで実行しました

i = 1;
While[i < Limit, 
data[[i]]  = f[ data[[i]] , data[[i+1]], data[[i-1]] ];
i = i+2;

i = 2;
While[i < Limit, 
data[[i]]  = f[ data[[i]] , data[[i+1]], data[[i-1]] ];
i = i+2;

ご覧のとおり、最初にリストの奇数の場所で操作を実行し、次に偶数の場所で操作を実行します。問題は、解が収束するまでにこれを 1 万回ほど実行する必要があり、時間がかかりすぎることです。それで、おそらくネストを使用してこれをより高速な方法で達成できるかどうか疑問に思っていましたが、計算で data[[i+1]] と data[[i-1]] をどのように使用できますか?

些細な質問かもしれませんが、よろしくお願いします

ありがとうございました

4

2 に答える 2

0

まず、リラクゼーション法はその性質上、本質的に遅いことに注意してください。したがって、それを使用して超高速の結果が得られるとは思わないでください。実際の問題には、他の(非常に高速な)方法があります。

とにかく、いくつかの要因であなたのパフォーマンスを向上させる可能性のある提案がいくつかあります.

まずf、関数はコンパイルするのに十分単純であるべきだと思います。そうしてください!のようなものだと思います

f=Compile[{{a,_Real},{b,_Real},{c,Real}},"Write f[a,b,c] explicitly",CompilationTarget->"C"]

動作するはずです。

2 番目:を使用してみてくださいFixedPoint。そうするために、私はおそらく次のようなことをするでしょう(または多分少し良いこと:-):

g[data,_List]:=Block[{i = 1},
    While[i < Length[data], 
    data[[i]]  = f[ data[[i]] , data[[i+1]], data[[i-1]] ];
    i = i+2;
    ]
    i = 2;
    While[i < Length[data], 
    data[[i]]  = f[ data[[i]] , data[[i+1]], data[[i-1]] ];
    i = i+2;
    data];
FixedPoint[g,"initialdata",SameTest->((#1-#2).(#1-#2)<10^(-4)&)]

また、境界条件を自分で処理する必要があります。

于 2013-08-24T07:22:03.210 に答える