掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29599

ルンゲ・クッタ法なのですが
投稿者---ゆで(2007/01/25 17:25:45)


#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<float.h>
#define N 4

int main(void)
{
    char s[256];
    FILE *fp;   /* (1)ファイルポインタの宣言 */

    fp = fopen("alinda5.txt","w");
            /* ファイル名 */
    fgets(s, 256, fp);
    {
        /* ここではfgets()により1行単位で読み出し */
    long double fm[N], x[N];
    double  h, t, ti, tf;
    int i, j;
    long double  ff[N][N];
    long double  f[N];
    long double  xx[N];
    long double  hh;
    long double  gs, r;
    

 fprintf(fp,"#     T           X             Y             U             V\n");
    
    gs = 2.959122080;
    gs = gs * (-10000.0);
    ti = 0.000;
    tf = 1600.0;
    h  = 20.0;
        x[0] = 1.0989720;
        x[1] = 0.0;
        x[2] = 0.0;
        x[3] = 0.020488550;
    
    for(t = ti; t <= tf; t += h){
        for(i = 0; i < N; i++){
          fprintf(fp,"%f,     %9e,   %9e,  %9e,   %9e,   \n", t, x[0], x[1], x[2], x[3]);   

          for(j = 0; j < 3; j++){
              hh = (j / 2.0) * h / 2.0;   
          xx[i] = x[i] + f[i] * hh;  
              r  = sqrt((x[0] * x[0]) + (x[1] * x[1]));
              f[0] =  x[2];
              f[1] =  x[3];
              f[2] =  -1.0 * gs * x[0] / (r * r * r);
              f[3] =  -1.0 * gs * x[1] / (r * r * r);  
          ff[i][j] = f[i];            
              fm[i] = (ff[i][0] + 2.0 * ff[i][1] + 2.0 * ff[i][2] + ff[i][3]) / 6.0;                  
          x[i] = xx[i] + fm[i] * h; 
             }
        }
    }
    fclose(fp); /* (5)ファイルのクローズ */   
    return 0;
    }
}



コンパイルとビルドは成功するものの、実行がうまくいきません。
どうやら計算式に誤りがあるようなのですが、どこが悪いのか、分からず。
どなたかご教授願えませんか?

使用環境はWindowsXPのBorlandC++です。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ルンゲ・クッタ法なのですが 29600 sticky-bit 2007/01/25 17:35:52


No.29600

Re:ルンゲ・クッタ法なのですが
投稿者---sticky-bit(2007/01/25 17:35:52)


>     fp = fopen("alinda5.txt","w");
>             /* ファイル名 */
>     fgets(s, 256, fp);
> 
>  fprintf(fp,"#     T           X             Y             U             V\n");

fpは読み込み用ですか?書き込み用ですか?
char型配列sの使い道は何ですか?




この投稿にコメントする

削除パスワード

No.29601

Re:ルンゲ・クッタ法なのですが
投稿者---ゆで(2007/01/25 18:30:37)


fpは読み込み用ですか?書き込み用ですか?
char型配列sの使い道は何ですか?

fpは書き込み用としてです。
ファイル入出力関連のページに記述されていたのを基に書いているので、sの使い道はいまいちよく理解しておりません。
申し訳ございません。


この投稿にコメントする

削除パスワード

No.29602

Re:ルンゲ・クッタ法なのですが
投稿者---sticky-bit(2007/01/25 20:55:21)


さしあたり、変数sの定義とfgetsは不要ですね。
ところで、今回解きたい常微分方程式は何ですか?



この投稿にコメントする

削除パスワード

No.29603

Re:ルンゲ・クッタ法なのですが
投稿者---ゆで(2007/01/25 22:32:16)


試しにfgetsとsの辺りを取り除いてコンパイルしようとしましたが、駄目でした。
常微分方程式はタイトルにも書いたようにルンゲ・クッタ法というものの4次の物です。


この投稿にコメントする

削除パスワード

No.29605

Re:ルンゲ・クッタ法なのですが
投稿者---sticky-bit(2007/01/25 23:04:36)


>試しにfgetsとsの辺りを取り除いてコンパイルしようとしましたが、駄目でした。

どういう風にダメだったか、エラーメッセージを添えるなどして
具体的に教えてほしいものです。
「ダメでした」だけでは、何も伝えていないのと同じです。

>常微分方程式はタイトルにも書いたようにルンゲ・クッタ法というものの4次の物です。

具体的な方程式を教えてほしかったのですが、
うまく伝わっていなかったようです。
方程式とソースコードが本当に一致しているか
(つまり、解きたい問題のプログラムを正確に書いているかどうか)、
念のために確認しておきたいのです。


この投稿にコメントする

削除パスワード

No.29607

Re:ルンゲ・クッタ法なのですが
投稿者---ゆで(2007/01/25 23:51:25)


こちらが上のレスを書いた際のソースです。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<float.h>
#define N 4

int main(void)
{
    
    FILE *fp;   
    fp = fopen("alinda5.txt","w");
                       long double fm[N], x[N];
    double  h, t, ti, tf;
    int i, j;
    long double  ff[N][N];
    long double  f[N];
    long double  xx[N];
    long double  hh;
    long double  gs, r;
    /* double  tt; */

 fprintf(fp,"#     T           X             Y             U             V\n");
    
    gs = 2.959122080;
    gs = gs * (-10000.0);
    ti = 0.000;
    tf = 1600.0;
    h  = 20.0;
        x[0] = 1.0989720;
        x[1] = 0.0;
        x[2] = 0.0;
        x[3] = 0.020488550;
    
    for(t = ti; t <= tf; t += h){
        for(i = 0; i < N; i++){
          fprintf(fp,"%f,     %9e,   %9e,  %9e,   %9e,   \n", t, x[0], x[1], x[2], x[3]);   

          for(j = 0; j < 3; j++){
          hh = (j / 2.0) * h / 2.0;        
            xx[i] = x[i] + f[i] * hh;  
            r  = sqrt((x[0] * x[0]) + (x[1] * x[1]));
            f[0] =  x[2];
            f[1] =  x[3];
           f[2] =  -1.0 * gs * x[0] / (r * r * r);
            f[3] =  -1.0 * gs * x[1] / (r * r * r);             
            ff[i][j] = f[i];                     
            fm[i] = (ff[i][0] + 2.0 * ff[i][1] + 2.0 * ff[i][2] + ff[i][3]) / 6.0;
                         
             x[i] = xx[i] + fm[i] * h; 
             }
        }
    
    fclose(fp);     
    return 0;
    }
}




情報 :コンパイル中: E:\c_20070116_25_alinda.c
エラー : c_20070116_25_alinda.c(16,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(17,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(18,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(19,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(20,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(21,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(22,1):Declaration is not allowed here
エラー : c_20070116_25_alinda.c(23,1):Declaration is not allowed here
警告 : c_20070116_25_alinda.c(66,2):Function should return a value

x'=u
y'=v
u'=-gs・x/r^3
v'=-gs・y/r^3

r^3はrの3乗として、x',y',u',v'はそれぞれx,y,u,vの1ステップ後の状態です。


この投稿にコメントする

削除パスワード

No.29610

Re:ルンゲ・クッタ法なのですが
投稿者---sticky-bit(2007/01/26 10:56:40)


>    fp = fopen("alinda5.txt","w");

書く場所が正しくありません。
変数群の定義が終わった後
(今回のプログラムでは、1個目のfprintfの直前)に
書かねばなりません。

それから、ファイルのオープンに失敗した場合
(fpがNULLの場合)について考慮してください。

>    fclose(fp);     
>    return 0;

書く場所が正しくありません。
変数tに関するfor文の外側に書いてください。


これで、コンパイル時のエラーや警告はなくなるはずです。
しかし、他の点でいくつか問題があります。

1)以下の計算を行なう際、f[i]の値が不定(どんな値かわからない)の
状態の場合があります。

>           xx[i] = x[i] + f[i] * hh;  

初めてxx[i]を求める際、「その前に」f[i]の値が定まっている必要があります。
しかし、プログラムはそうなっていません。
xx[i]を求めた「後」で、f[0]〜f[3]の計算を行なっています。

2)以下のfor文で、jの上限は2でよいのでしょうか?

>          for(j = 0; j < 3; j++){
(中略)
>            ff[i][j] = f[i];                     

jは3にはなりませんので、ff[i][3]の内容は不定です。

3)以下の文を書いている場所は正しいでしょうか?

>            fm[i] = (ff[i][0] + 2.0 * ff[i][1] + 2.0 * ff[i][2] + ff[i][3]) / 6.0;
>                         
>             x[i] = xx[i] + fm[i] * h; 

ff[i][0]〜ff[i][3]の値を使っていますので、
jに関するfor文の「外側」でないとまずくありませんか?

4)long double型の変数を出力する際、書式文字列にLを付けてください。
例:%Lf, %9Le




この投稿にコメントする

削除パスワード

No.29612

Re:ルンゲ・クッタ法なのですが
投稿者---ゆで(2007/01/26 14:16:26)


ありがとうございます。
ご指摘の件を元に手直しをしてみたところ、うまくコンパイルもビルドも通り、後は数値計算のところを多少手直しする程度になりました。

今後何かしらありましたらよろしくお願いいたします。
重ね重ね、ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧