• ベストアンサー

第1種変形ベッセル関数

第1種変形ベッセル関数をFortranで書くとどのようなプログラムになるのでしょうか。 Fortran初心者です。よろしくお願いします。

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

  • ベストアンサー
  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.4

#3です。訂正です。 DIMENSION FAC(100) DO 10 K=1,100,1 I=1 DO 20 J=1,K,1 I=I*J 20 CONTINUE FAC(K)=I 10 CONTINUE S=0 L=10 DO 100 I=0,L,1 DS=(X/2)**(2*I)/FAC(I)/FAC(N+I) S=S+DS 100 CONTINUE EIN=S*(X/2)**N RETURN END Lを100より大きくするときはFACをそれに合わせて作ってください。 L=170ぐらいまではこのままでできます。

wing11_14jp
質問者

お礼

ありがとうございました。早速試させていただきます・

その他の回答 (4)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.5

 デキアイのライブラリをテストしてみると、用途に照らして精度が不足だったり余りに遅かったりということも、案外あるものです。また、実行環境によっては、ライブラリを突っ込むスペースすらもない、ということだってあり、自作するのは必ずしもおかしなことではありません。 > Fortran初心者です  いやいや、Fortranばかりでなく、数値計算の超初心者ですよね。 (0) 何のために第1種変形ベッセル関数を使うのか。ホントに必要なのか。  「何のために計算するんだかきちんと考え直してみたら、そもそもそんな計算は要らなかった」だとか「もっと簡単な関数で充分代用(近似)できる」ということがしばしばあります。また時には、単に式を整理したらベッセル関数が消えちゃった、なんてマヌケな話もあります。  ホントに要るんだという場合でも「高性能のハードウェア上でごくたまーに使う」というのと、「200円のマイコン上で毎秒何千回も」と言うのでは、考え方が全く違ってきます。 (1) 第1種変形ベッセル関数を、その都度計算する必要があるのか。  たとえば、特定のαとxにおけるIα(x)を1回だけ使う、というのだったら、そもそもプログラムを書く必要がないでしょ?いや、そこまで極端でなくても、大抵の応用では、あらかじめ数表を作っておけば済みます。次に (2) 第1種変形ベッセル関数をどんな範囲のαとxで使い、どれだけの精度が必要なのか。  (「Iα(x)を計算して印刷しなさい」なんて練習問題は論外としますと、)その結果を使って何か意味のある計算をやる訳ですから、α、xの範囲と、関数の値に求められる精度が分かる筈です。数表にする場合にも、この情報は必須ですね。もちろん、αとxの範囲が狭く、さして精度が要らないのなら、小さな表を作っておけば済みます。  αとxの範囲と必要な精度を見極めて、ようやく (3) どんな計算式を使って第1種変形ベッセル関数を計算するか。その計算式を如何にして計算するか。 の検討ができる。  たとえば「第1種変形ベッセル関数とは言っても、αとxがこの範囲で必要な精度がこれだけであるなら、双3次関数による近似だけで充分だ」なんてことが判明し、ほんの数行のコードで済んでしまう、なんてことも、しばしば(かなりしばしば)あります。  そうも行かないという時には、大抵は繰り返し(loop)の計算になります。すると、単に計算式どおりに計算していく、というのでは良い性能(スピードと精度)が得られません。「計算式を如何にして計算するか」が問題です。たとえば、近似値を効率よく改良できる漸化式を考案したり、数値計算に伴う誤差を抑え込む工夫をしたり、無駄な計算をしないための打ち切りの判定条件を案出したりして、計算式からアルゴリズムを創り出す。(実は、ここが数値計算プログラミングの腕の見せ所であり、同じ精度を出すのにヘタと上手とでは計算時間が10000倍違う、なんてこともあります。)  この段階では、どんなやり方がいいか、実際にテストプログラムを書いたり、表計算ソフトを使ったりして、結果を見て検討することになるでしょう。 (4) 実装方法を決め、コーディングする。  時には、プログラミング言語に適した実装方法、つまり「書き方」を工夫しなくてはならないことがあります。Fortranは、版によってはイマドキのプログラミング言語なら当たり前に持っている機能がなかったりします。(なにしろ元は1955年製ですから。)  ここまできてようやく「Fortranで書くとどのようなプログラムになる」かが決まる。だから、ご質問を見ただけでシロートだなとバレちゃうんです。 (5) テストベッド(FUNCTIONを呼び出すメインプログラム)を製作し、テストする。  少なくとも2回、有効桁数(precision)を変えて計算してみて、両者の結果を比較します。必要な精度までどちらのテスト結果も一致していればいいんですが、さもなければ、有効桁数の多い方の計算ですら充分な精度が出ていないおそれがあります。もちろん、いくつかの(α,x)について、「正解」を用意する必要もありますね。  というわけで、ご自身の質問の意味がお分かりになったところで、(0)から順に始めましょう。

wing11_14jp
質問者

お礼

ご指摘とおりです。数値計算についても初心者です。今一度、自分の中で整理したいと考えております。

  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.3

整数(n)次の第1種変形ベッセル関数EI(n,x)は EI(n,x)=(x/2)^n*[lim(j→∞)Σ(i=0,j)(x/2)^(2i)/i!/(n+i)! で表されます。 FORTRANは最近まったく使わないので間違っているかもしれませんが一応書いてみます。 無限級数ですが収束するということは有限項でも間に合うということでL項まで計算してみて Lを増減してあたりをみます。 階乗を最初に作っておきます。 DIMENSION FAC(100) DO 10 K=1,100,1 I=1 DO 20 J=1,K,1 I=I*J 20 CONTINUE FAC(K)=I 10 CONTINUE S=0 L=10 DO 100 I=0,L,1 DS=(X/2)**(2*I)/I!/(N+I)! S=S+DS 100 CONTINUE EIN=S*(X/2)**N RETURN END あちこち訂正しながらやってみてください。 変形でないベッセルを散々扱かったので10項ぐらいで3ケタは合うでしょう。 100項やれば5ケタぐらい合います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「ライブラリ等は使わないで組めれば」と考える理由が分からない. ライブラリ関数を使えるなら, その方がいいに決まってる. わざわざ時間と手間をかけてバグの入る可能性を増やすことなど愚の骨頂.

  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.1

ライブラリーにあると思いますが、級数展開で数値会を求めたいということですか。

wing11_14jp
質問者

補足

ありがとうございます。ライブラリ等は使わないで組めればと考えております。よろしくお願いします

関連するQ&A

  • 0次と1次の第2種変形ベッセル関数の関係

    0次の第2種変形ベッセル関数 K_0(x)は微分することで 1次の第2種変形ベッセル関数 K_1(x)と一致します。 つまり、 d/dx [ K_0(x) ] = - K_1(x) という関係があります。 一方で、 K_1(x) = f ( K_0(x) ) あるいは K_0(x) = f ( K_1(x) ) のように関数による関係はございますでしょうか? 手元にある特殊関数の書籍を見てみましたが載っていませんでした。 どなたかご存じでしたら教えてください。

  • 変形ベッセル関数

    変形ベッセル関数K0(x)はxが実数の時に、関数値が実数となるよう 定義されていることになっていますが、どのような式になるのか 教えてください。

  • 変形ベッセル関数の微分について。

    変形ベッセル関数の微分について。 添付画像の一行目の式が微分公式です。 そこで質問ですが、二行目の式の左辺のようにベッセル関数の引数に係数が かかった場合は、二行目の式の右辺のようになりますか?

  • ベッセル関数のゼロ点を求めるプログラム

    ベッセル関数のゼロ点(x軸との交点)を小さい順に10個求めるプログラムを作りたいのですが、プログラム作成に不慣れなもので困っています。 参考程度でもいいのでどなたかお教え願えませんでしょうか? よろしくお願いします。 ちなみにベッセル関数は第1種でして、プログラムはMatlabを使おうと思います。

  • ベッセル関数

    周波数変調波の式を第一種ベッセル関数を用いて表わすにはどうすればいいのか分かりません。何かいいサイトなどあればよろしくお願いします。

  • ベッセル関数

    円筒座標系での電磁場のマクスウェル方程式を磁場に関して解いて得られる解が複素数を引数とする0次のベッセル関数 AJ0(kr)、kが複素数、Aは実係数、rは実変数 で得られるのですが 引数を実数に変換する方法がわかりません。 純虚数の引数であれば実数の引数の変形ベッセル関数に変換でき、 実数の引数であれば手持ちの本にベッセル関数の値が載っているのですが 複素数の引数の場合の処理方法がわからなくて困っています。 よろしくお願いします。

  • 第1種ベッセル関数の計算

    画像にある計算式(ベッセル関数の積分)を解きたいのですが、解き方がわかりません。 ベッセル関数について調べてみてもよくわからず、計算ができません。 解き方と計算結果を教えていただきたいです。 よろしくお願いします!

  • ベッセル関数の零点

    円形膜の振動を考えた時にその解はベッセル関数を用いて表されると思うのですが、第1種ベッセル関数の零点を求める際に必要なm,nの値はどのように決定すればいいのでしょうか。 よろしくお願いします。

  • ベッセル関数って、

    大学生です。 最近、勉強していると、振動の分野で「ベッセル関数」なるものが現れました。 振動の分野は全く専門外で、突然ベッセル関数を使われて、こまってます。 また、やさしく説明してくれる本も、探してますが、あまり時間がありません。  この「ベッセル関数」は、    いったいどんな関数で、    この関数をなぜ使うのか?    この関数を使うと、何が出てくるのか、    この関数は何を意味しているのか、  教えてください。 (ちなみに、円筒形の固有振動数を求める式でベッセル関数が出てきました。)

  • ベッセル関数の近似式

    VBAを使っていて、ベッセル関数を使いたいのですが、 worksheetfunctionを使わずに計算したいので、近似式を探しています。 第一種0次ベッセル関数に関してはこのページで見つけることができました。 http://soudan1.biglobe.ne.jp/qa5670519.html 他のベッセル関数や特殊関数の近似式が書かれてある webページがあれば教えていただけないでしょうか?