2011-12-20 16 views
3

私はIntegration in Mathematicaで言及した問題のデモを見たいと思っていますが、それはまだ非常に遅く、Manipulateは滑らかではありません。Mathematicaで "操作"を最適化する

以下を考慮して、状況を改善する手段があるかどうか。それは、より連続的なダイナミックを参照してください。また、私はこれがあなたのために任意のより良いであれば

コントロール - >マニピュレータ[Appearance-> [開く]

arrows = ParallelTable[{ 
RandomVariate[NormalDistribution[0, Sqrt[1]]], 
RandomVariate[NormalDistribution[0, Sqrt[1]]]}, {20000}]; 

Manipulate[ 
      Graphics[{ 
        White, Rectangle[{-5, -5}, {5, 5}], 
        Red, Disk[{0, 0}, 1], 
        Black, Point /@ (arrows[[;; i]]), 
        Text[Style[ 
           Total[ 
            If[# < 1, 1, 0] & /@ 
         (EuclideanDistance[{0, 0}, #] & /@ 
         arrows[[;; i]])]/[email protected][[;; i]] // N, 
          Bold, 18, "Helvetica"], {-4.5, 4.5}]}, 
      ImageSize -> 800], 
{i, Range[2, 20000, 1]}, 
ControlType -> Manipulator, 
SaveDefinitions -> True] 

enter image description here

+1

'Manipulator'を開いてラベル付けした状態で取得するには' {i、Range [2、20000、1]、ControlType - >マニピュレータ、 の外観 - > {"Open"、 "Labeled"}} 'が必要です – kglr

答えて

7

遅さのための主な理由はあります。このステップをManipulateから外すと、違いが見えます。

prob = MapIndexed[#1/#2 &, Accumulate[ 
    EuclideanDistance[{0, 0}, #] < 1 & /@ arrows // Boole]] ~ N ~ 4; 

平池のソリューションは、あなたやナッサーよりもはるかにスムーズですので、例として使用します。あなたはとしてそれにprobの事前計算された値を使用したい:

Manipulate[ 
Graphics[{White, Rectangle[{-5, -5}, {5, 5}], Red, Disk[{0, 0}, 1], 
    Black, Point[arrows[[;; i]]], 
    Text[Style[[email protected][[i]], Bold, 18, "Helvetica"], {-4.5, 4.5}]}, 
    ImageSize -> 200], {i, Range[2, 20000, 1]}, 
ControlType -> Manipulator, SaveDefinitions -> True] 

そうでない場合、あなたは周りのフィギュアジャンプが表示されますので、私は、4桁に均一に精度を設定したときの有効桁数変更。

+0

はい、ソリューションはよりスムーズです。私は本当にアルゴリズムが何をしているのか見ていませんでした。私はちょうどSynchronousUpdating - > Falseを追加し、少し早くなった 'If'の前にDynamicを追加しました。コードが実際に何をしているかについては、私は見ていません:) – Nasser

+0

+1は、冗談ではありません。 :-)ところで、どの項が関数であるかがわかるので、私はa〜N〜bを介してa〜N〜bの組版を好みます。これは、中断文字列を開始する場合に役立ちます。 –

+0

@ Mr.Wizardありがとう、それは確かに良いヒントです!私は時にはそれらを弦を張るときに均等に混乱しています。 – abcd

2

を参照してください使用して開いたマニピュレータを持って取得することができません:

Manipulate[ 

Graphics[{ 
    White, 
    Rectangle[{-5, -5}, {5, 5}], 
    Red, 
    Disk[{0, 0}, 1], 
    Black, Point /@ (arrows[[;; i]]), 
    Text[Style[ 
    [email protected][ 
     If[# < 1, 1, 0] & /@ (EuclideanDistance[{0, 0}, #] & /@ 
      arrows[[;; i]])]/[email protected][[;; i]] // N, Bold, 18, 
    "Helvetica"], {-4.5, 4.5}]}, ImageSize -> 200], 

{{i, 2, "i"}, 2, 20000, 1, Appearance -> "Labeled"}, 
TrackedSymbols :> {i}, 
SynchronousUpdating -> False, 
AppearanceElements -> All, 


Initialization :> 
    (
    arrows = 
    ParallelTable[{RandomVariate[NormalDistribution[0, Sqrt[1]]], 
     RandomVariate[NormalDistribution[0, Sqrt[1]]]}, {20000}]; 
    ) 

] 
+0

より良いと思われる!ありがとうございました。しかし、テキストはオフです。私は急速に.39に収束すると考えています。なぜそれが良いのかを説明することもできます:-)? – 500

+0

@ 500、テキストはオフですか?私はテキストのものに触れなかった。このバージョンとあなたのバージョンとの差分を見ると、より速くなった変更を見ることができます。 – Nasser

5

多分このようなもの

あなたは すべてのステップ iためにステップ iまで EuclideanDistanceすべて のポイントを計算しているので
Manipulate[ 
Graphics[{White, Rectangle[{-5, -5}, {5, 5}], 
    Red, Disk[{0, 0}, 1], 
    Black, Point[arrows[[;; i]]], 
    Text[Style[Count[arrows[[;; i]], a_ /; (Norm[a] < 1)]/i // N, Bold, 
     18, "Helvetica"], {-4.5, 4.5}]}, ImageSize -> 800], {i, 
    Range[2, 20000, 1]}, ControlType -> Manipulator, 
SaveDefinitions -> True] 
+1

非常に高速で応答性が高い - +1。 'Total [UnitStep [1 - #]&@ Sqrt @ Total [Transpose [arrows [[;;}]を使うことで、応答性をいくらか向上させることができます。 i]]^2]]/i // N 'をカウントすることができますが、それはあなたのコードが与えるスピードアップに少しだけ追加されます。 –

関連する問題