綺麗なローレンツ・アトラクタの描き方

このQ&Aのポイント
  • ローレンツ方程式をEuler法を利用してプログラムを作成し、綺麗なアトラクタを描くための刻み幅と計算回数を教えてください。
  • 私は刻み幅h = 0.001、計算回数n = 100000としていますが、他にもうまく描ける組み合わせがあるのでしょうか。
  • 図から左円の中心が小さく、右円の中心が大きい状態が均一になるようにしたいです。
回答を見る
  • ベストアンサー

綺麗なローレンツ・アトラクタの描き方?

ローレンツ方程式 dx/dt = p*(-x + y) dy/dt = r*x - y - x*z dz/dt = -b*z + x*y をEuler法を利用して、プログラムを作成して、gnuplotでplotしているのですがこのローレンツ・アトラクターの2つの円の中心が均一に(私の場合は左円の中心が小さく、右円の中心が大きい)なるようにして、 綺麗なアトラクターを描くには刻み幅と計算回数をどれくらいの値にすればいいのでしょうか? 私は刻み幅h = 0.001、計算回数n = 100000としてます。 *Euler法に変換したプログラムと図は下の通りです。 図 http://www26.tok2.com/home/parshem//image/lorenz-O.jpg #include <stdio.h> #include <math.h> int main(void) { /*---Parameter---*/ int p = 10; int r = 28; double b = 8.0/3.0; double x, y, z, xn, yn, zn, h, i, n; x = 1.0; y = 1.0; z = 1.0; h = 0.001;//ステップの刻み n = 400000; /*---Lorenz Equation & Euler---*/ for(i = 0.0 ; i < n ; i++){ xn =x + h * p*(-x + y) ; yn =y + h * ( r*x - y - x*z ); zn =z + h * ( -b*z + x*y ); printf("%lf\t%lf\t%lf \n", xn, yn, zn); x = xn; y = yn; z = zn; } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • chemo666
  • ベストアンサー率80% (4/5)
回答No.1

気になったので試してみましたが、 刻み幅と計算回数だけでなく、開始値でも形状が変わるみたいです。 計算処理やプロット描画が重かったので計算回数を10分の1に 減らしましたが、 x = 1.0; y = 1.15; z = 10.0; h = 0.001; n = 40000; で計算してみたら割と左右の中心が均等になった気がします。 色々値を変えて試してみると良いかもしれません。 それと気になったのですが、変数 i と n は計算回数のカウンタとしてしか 使用していないみたいなので double 型ではなく int 型にした方が 若干でも計算は速くなると思いますよ。

palshem
質問者

お礼

回答、ありがとうございます。 私自身もいろいろと試してみてたのですが、開始値のほうには気づかなかったですw x = 1.0; y = 1.15; z = 10.0; から試してみて x = 1.0; y = 1.15; z = 17.0; で均一に見えるようになったと思えます。 ありがとうございまじた。

関連するQ&A

  • 代数学の問題を教えて下さい。

    この問題が分かりません。お願いいたします。 行列A= (0 2 -1) (1 1 -1) (-2 2 1) とする。 X=1,Y0=0,Z0=0である。n>=0で漸化式 X(n+1)=2Yn-Zn Y(n+1)=Xn+Yn-Zn Z(n+1)=-2Xn+2Yn+Zn を満たす数列{Xn}{Yn}{Zn}を考える(n>=0)。このとき 一般項Xn,Yn.Znを求めなさい という問題です。どうかお願いいたします。

  • C言語 所々の意味を教えてください><;

    #include <stdio.h> #define N 100 int main(void) { double xn[N], yn[N], x, y; int i, cnt; FILE *fp; if((fp=fopen("data.txt", "r"))==NULL) return 0; for(i=0; fscanf(fp, "%lf%lf", xn + i, yn + i)==2; i++); cnt = i; scanf("%lf", &x); if(x < xn[0] || xn[cnt-1] <= x) return 0; for(i=0; xn[i] < x; i++); y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; printf("y = %f\n", y); return 0; } この文の FILE *fp; if((fp=fopen("data.txt", "r"))==NULL) return 0; for(i=0; fscanf(fp, "%lf%lf", xn + i, yn + i)==2; i++); cnt = i; ここの部分でデータテキストを読み込んでるのはわかるんですが fscanf(fp, "%lf%lf", xn + i, yn + i)部分で何をやってるかわかりません。誰か教えてください

  • 線形補間

    線形補間での求め方 問題文: 1.数値を読み込む 2.xを読み込む 3.x<x1 または x>xnならエラー 3.x1<x<i+1 となるiを見つける 4.補間公式でyを求める 5.結果をプリントする #include<stdio.h> float hokan(void); int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75}; double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573, 0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965}; int x=5; void main() { printf("y = %lf\n", hokan()); } float hokan(void) { int i; double y; if(x <0|| 75<= x){ printf("エラーです\n"); } else{ for(i=0; xn[i] < x; i++) y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; return y; } } 数表を最初にxnとynで表記しています。 このプログラムで線形補間が行われてないそうなのですが・・ 何か誤りがある様でしたらどなたか教えてください。

  • mathematicaでリストの格納

    mathematicaでTable関数で作成したリスト {{x1, y1, z1, f(x1,y1,z1)}, {x2, y2, z2, f(x2,y2,z2)}, ... , {xn, yn, zn, f(xn,yn,zn)}} 中のx1~xnまでの各成分とy1~ynまで(、z1~znまで、 f(x1,y1,z1)~f(xn, yn, zn)までの各成分)をそれぞれ配列に格納するにはどうすればいいのでしょうか?(C言語のようにループ文で配列に格納することはできないのでしょうか?) もしくは、行列中で列の成分を取り出すことはできますか? どなたか解法を示していただければ幸いです。

  • 不等式の問題

    x1>x2>・・・・>xn y1>y2>・・・・>yn という関係のある実数がある。 yの並べ替えたものをz1、z2・・・・znとする。 Σ(k=1~n)xk・yk≧Σ(k=1~n)xk・zk となることを証明せよ。 という問題がありました。 どうやって解けばよいでしょうか?結構いろいろな解法があるようですが、わかりません。

  • この問題解いて下さいm(_ _)m

    3以上の自然数nに対して、 Xn+Yn=Znを 満たすような自然数 X、Y、Zは存在しない、 これを証明せよ!! (天才数学者が、8年かかった問題) よろしくお願いします!

  • 数学B 数列 センター向けの問題です

    数列{xn}は x1=5,x(n+1)=xn+2 (n=1,2,3,・・・) で定義された数列である。 x2=7,x3=9 であり、 xn=2n+3 である。 次に、数列{yn}は y1=3,y(n+1)=yn+2n+3 (n=1,2,3,・・・) で定義された数列である。このとき yn=n^ア+イn Σ[k=1→n]yk=(1/6)n(n+ウ)(エn+オ) である。 さらに、数列{zn}を x1,y1,y2,x1,x2,x3,y1,y2,y3,y4,・・・ とし、この数列{zn}を x1|y1,y2|x1,x2,x3|y1,y2,y3,y4|・・・ のように、1個、2個、3個、4個、・・・と区画に分ける。すなわち、l=1,2,3,・・・として 第(2l-1)区画にはx1,x2,x3,・・・,x(2l-1) の項があり、 第2l区画にはy1,y2,y3,・・・,y2l の項があるように区画に分ける。 このとき、z199は第カキ区間のク番目の項であるから z199=ケコ である。また Σ[k=200→240]zk=サシスセ である。 解答 n^ア+イn=n^2+2n (1/6)n(n+ウ)(エn+オ)=(1/6)n(n+1)(2n+7) カキ=20 ク=9 ケコ=99 サシスセ=3815 この問題の解き方がわかりません 解き方を教えて下さい よろしくお願いします

  • 全順序集合と半順序集合

    x=(x1,…xn) , y=(y1,…,yn) ∈R^n に対して x≦yを Σ(i=1からkまで)x(i) ≦ Σ(i=1からkまで)y(i) (k=1,2,…,n) によってR^nに関係≦を導入する。 R^nはこの≦に関して半順序集合になっていることを示せ。 また、x≦(にならない)y , y≦(にならない)x となるx,yの例をあげよ。 という順序集合の問題です。 反射的・反対称的・推移的の3つを示せば良いのは分かるのですが、どのように書いて良のか分かりません。 例:推移的を示す 任意のx=(x1,…xn) , y=(y1,…,yn) , z=(z1,…,zn) ∈R^n に対して Σ(i=1からkまで)x(i) ≦ Σ(i=1からkまで)y(i) かつ Σ(i=1からkまで)y(i) ≦ Σ(i=1からkまで)z(i) ならば Σ(i=1からkまで)x(i) ≦ Σ(i=1からkまで)z(i)  は成り立つ。 このように、そのまま書けば良いのでしょうか・・・? それから、最後の例をあげよのところは、全順序集合にはならないための反例になっているのだと思いますが、どうしても思いつきません。 ∞を考えるのでしょうか・・・? そもそも全順序集合は半順序集合が成り立つことが前提みたいに習いましたが、反対称的の 任意のa,b∈Xに対して aRb,bRa⇒a=b ここで、aRbとbRaが成り立つことを言ってしまっているので、必ずaRbかbRaになっているような半順序集合は全順序集合という定義も意味がないような気がしてしまいます。 よろしくお願いします。

  • 論理回路

    2n変数論理関数 fn(x1,x2,...,xn,y1,y2,...,yn)={ 1 N(x1,x2,...,xn)>N(y1,y2,...,yn)の時                 0 その以外 について、以下の問に答えよ。ここで、Nは入力を2進数とみなしたときの数を値として持つ関数であり、N(x1,x2,...,xn)=Σ(i=1~n)xi2^n-iと表すことができる。 問 任意のn>=2に対して     fn(x1,x2,...,xn,y1,y2,...,yn)= x1・y1(bar) + (x1+y1(bar))・fn-1(x2,...,xn,y2,...yn) が成り立つことを示せ。ただし、(bar)が論理否定、・が論理積、+は論理和を表す という問なのですが、どのように証明をすればよいのでしょうか? お願いします。

  • ローレンツ変換

    S系とS'系の時空座標(x,y,z,t)と(x',y',z',t')の間のローレンツ変換式において、 x^2+y^2+z^2-(ct)^2=x'^2+y'^2+z'^2-(ct')^2 の関係が成り立つのはどのような場合ですか。 またローレンツ変換について詳しく教えてください。 回答よろしくお願い致します。