ショッピングモール  Personal Health / Stress ( Aromatherapy )


掲示板利用宣言

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

 私は

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

掲示板1

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

No.4974

main関数を分割
投稿者---aaa(2005/11/28 02:28:13)


いつもお世話になっています。今、以下のプログラムのmain関数を出来るだけ簡単にしようとしてしています。そこで自分でやってみたのですがなかなか出来ません。自分で分けたのをもう一度載せますので以下のプログラムと見比べて間違っている場所のご指摘をお願いします。
#include <stdio.h>
#include <math.h>

#define r1    sqrt(2.0)
#define r2    1.0
#define m1    0.4
#define m2    0.6
#define m12   1.0
#define pi    3.1416

double func_f(double t,double th1,double W1,double th2,double W2);
double func_g(double t,double th1,double W1,double th2,double W2);
double func_i(double t,double th1,double W1,double th2,double W2);
double func_j(double t,double th1,double W1,double th2,double W2);

void main()   //ここからmain関数
{ 
    double t=0.0;
  double th1 = 132*pi/180;
    double th2 = 150*pi/180;
    double W1 = 0.0;
    double W2 = 0.0;
              //ここからの式を別の関数にしたいです
    double h=0.005;
    double b1,b2,b3,b4;
    double c1,c2,c3,c4;
    double d1,d2,d3,d4;
    double e1,e2,e3,e4;


while(t<=0.3){

    printf("%10.4lf %10.4lf %10.4lf %10.4lf %10.4lf\n",t,th1,th2,W1,W2);

    b1 = func_f(t,th1,W1,th2,W2);
  c1 = func_g(t,th1,W1,th2,W2);
    d1 = func_i(t,th1,W1,th2,W2);
  e1 = func_j(t,th1,W1,th2,W2);
    b2 = func_f(t + h/2.0 , th1+h*b1/2.0, W1+h*c1/2.0 ,th2,W2);
    c2 = func_g(t + h/2.0 , th1+h*b1/2.0, W1+h*c1/2.0 ,th2,W2);
    d2 = func_i(t + h/2.0 ,th1,W1, th2+h*d1/2.0, W2+h*e1/2.0);
    e2 = func_j(t + h/2.0 ,th1,W1, th2+h*d1/2.0, W2+h*e1/2.0);
    b3 = func_f(t + h/2.0 , th1+h*b2/2.0, W1+h*c2/2.0 ,th2,W2);
    c3 = func_g(t + h/2.0 , th1+h*b2/2.0, W1+h*c2/2.0 ,th2,W2);
    d3 = func_i(t + h/2.0 ,th1,W1, th2+h*d2/2.0, W2+h*e2/2.0);
    e3 = func_j(t + h/2.0 ,th1,W1, th2+h*d2/2.0, W2+h*e2/2.0);
    b4 = func_f(t + h , th1+h*b3, W1+h*c3 ,th2,W2);
    c4 = func_g(t + h , th1+h*b3, W1+h*c3 ,th2,W2);
    d4 = func_i(t + h ,th1,W1, th2+h*d3, W2+h*e3);
    e4 = func_j(t + h ,th1,W1, th2+h*d3, W2+h*e3);

    th1 += (h/6.0)*(b1+2.0*b2+2.0*b3+b4);
    W1 += (h/6.0)*(c1+2.0*c2+2.0*c3+c4);
    th2 += (h/6.0)*(d1+2.0*d2+2.0*d3+d4);
    W2 += (h/6.0)*(e1+2.0*e2+2.0*e3+e4);
    t += h;

    }         //ここまでの式を別の関数にしたいです 
}         //ここまでがmain関数です

double func_f(double t,double th1,double W1,double th2,double W2)
{
    return W1;
}

double func_g(double t,double th1,double W1,double th2,double W2)
{
    int g=9.8;
    double C = cos(th1 - th2);
    double S = sin(th1 - th2);
    return (( -(m2*m2*r1*r2*S*r2*r2*W2*W2) - (m2*m2*r1*r1*r2*r2*C*S)*W1*W1 - m12*g*r1*sin(th1)*m2*r2*r2 + m2*m2*g*r1*r2*r2*C*sin(th2)) / (m12*r1*r1*m2*r2*r2 - m2*m2*r1*r1*r2*r2*C*C));
}

double func_i(double t,double th1,double W1,double th2,double W2)
{
    return W2;
}

double func_j(double t,double th1,double W1,double th2,double W2)
{
    int g=9.8;
    double C = cos(th1 - th2);
    double S = sin(th1 - th2);
    return  (( -(m2*m2*r1*r1*r2*r2*C*S)*W2*W2 - m12*r1*r1*m2*r1*r2*S*W1*W1 - m12*m2*g*r1*r1*r2*C*sin(th1) + m12*r1*r1*m2*g*r2*sin(th2) ) / (m2*m2*r1*r1*r2*r2*C*C - m12*r1*r1*m2*r2*r2));
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> main関数を分割 4975 aaa 2005/11/28 02:36:37
<子記事> Re:main関数を分割 4977 Blue 2005/11/28 03:00:08


No.4975

main関数を分割
投稿者---aaa(2005/11/28 02:36:37)


最初のに続けての投稿文です。以下に自分で分割したプログラムを載せます。最初のに比べてどこが悪いのかご指摘をお願いします。
#include <stdio.h>
#include <math.h>

#define r1    sqrt(2.0)
#define r2    1.0
#define m1    0.4
#define m2    0.6
#define m12   1.0
#define pi    3.1416

void rk4(double *t,double *th1,double *W1,double *th2,double *W2);
double func_f(double t,double th1,double W1,double th2,double W2);
double func_g(double t,double th1,double W1,double th2,double W2);
double func_i(double t,double th1,double W1,double th2,double W2);
double func_j(double t,double th1,double W1,double th2,double W2);

void main()          //main関数です 
{
    double t=0.0;
   double th1 = 132*pi/180;
    double th2 = 150*pi/180;
    double W1 = 0.0;
    double W2 = 0.0;

    while (t<=0.3){

        printf("%10.4lf %10.4lf %10.4lf %10.4lf %10.4lf\n",*t,*th1,*th2,*W1,*W2);

        rk4(&t,&th1,&W1,&th2,&W2);
    }
}        //ここまでがmain関数です。


//ここからが分割した関数です
void rk4(double *t,double *th1,double *W1,double *th2,double *W2)
{
    double h=0.005;
    double b1,b2,b3,b4;
    double c1,c2,c3,c4;
    double d1,d2,d3,d4;
    double e1,e2,e3,e4;

    b1 = func_f(*t,*th1,*W1,*th2,*W2);
   c1 = func_g(*t,*th1,*W1,*th2,*W2);
    d1 = func_i(*t,*th1,*W1,*th2,*W2);
   e1 = func_j(*t,*th1,*W1,*th2,*W2);
    b2 = func_f(*t + h/2.0 , *th1+h*b1/2.0, *W1+h*c1/2.0 ,*th2,*W2);
    c2 = func_g(*t + h/2.0 , *th1+h*b1/2.0, *W1+h*c1/2.0 ,*th2,*W2);
    d2 = func_i(*t + h/2.0 ,*th1,*W1, *th2+h*d1/2.0, *W2+h*e1/2.0);
    e2 = func_j(*t + h/2.0 ,*th1,*W1, *th2+h*d1/2.0, *W2+h*e1/2.0);
    b3 = func_f(*t + h/2.0 , *th1+h*b2/2.0,          *W1+h*c2/2.0 ,*th2,*W2);
    c3 = func_g(*t + h/2.0 , *th1+h*b2/2.0, *W1+h*c2/2.0 ,*th2,*W2);
    d3 = func_i(*t + h/2.0 ,*th1,*W1, *th2+h*d2/2.0, *W2+h*e2/2.0);
    e3 = func_j(*t + h/2.0 ,*th1,*W1, *th2+h*d2/2.0, *W2+h*e2/2.0);
    b4 = func_f(*t + h , *th1+h*b3, *W1+h*c3 ,*th2,*W2);
    c4 = func_g(*t + h , *th1+h*b3, *W1+h*c3 ,*th2,*W2);
    d4 = func_i(*t + h ,*th1,*W1, *th2+h*d3, *W2+h*e3);
    e4 = func_j(*t + h ,*th1,*W1, *th2+h*d3, *W2+h*e3);

    *th1 += (h/6.0)*(b1+2.0*b2+2.0*b3+b4);
    *W1 += (h/6.0)*(c1+2.0*c2+2.0*c3+c4);

    *th2 += (h/6.0)*(d1+2.0*d2+2.0*d3+d4);
    *W2 += (h/6.0)*(e1+2.0*e2+2.0*e3+e4);

    *t += h;
}
//ここまでが分割した関数です。

double func_f(double t,double th1,double W1,double th2,double W2)
{
    return W1;
}

double func_g(double t,double th1,double W1,double th2,double W2)
{
    int g=9.8;
    double C = cos(th1 - th2);
    double S = sin(th1 - th2);
    return (( -(m2*m2*r1*r2*S*r2*r2*W2*W2) - (m2*m2*r1*r1*r2*r2*C*S)*W1*W1 - m12*g*r1*sin(th1)*m2*r2*r2 + m2*m2*g*r1*r2*r2*C*sin(th2)) / (m12*r1*r1*m2*r2*r2 - m2*m2*r1*r1*r2*r2*C*C));
}


double func_i(double t,double th1,double W1,double th2,double W2)
{
    return W2;
}

double func_j(double t,double th1,double W1,double th2,double W2)
{
    int g=9.8;
    double C = cos(th1 - th2);
    double S = sin(th1 - th2);
    return  (( -(m2*m2*r1*r1*r2*r2*C*S)*W2*W2 - m12*r1*r1*m2*r1*r2*S*W1*W1 - m12*m2*g*r1*r1*r2*C*sin(th1) + m12*r1*r1*m2*g*r2*sin(th2) ) / (m2*m2*r1*r1*r2*r2*C*C - m12*r1*r1*m2*r2*r2));
}



この投稿にコメントする

削除パスワード

No.4977

Re:main関数を分割
投稿者---Blue(2005/11/28 03:00:08)


ざっとみて、
> int g=9.8;
はおかしいのでは?
普遍で意味のある数値であるのならば、piのようにdefineしたりすべきのような。
# static const double g = 9.8;
# でもいいが。

一応ソースだけでなくて、何をやっているソースなのか説明がほしいと思いますけど。
意味合い的にドコで関数化させるかとかが重要なので。


この投稿にコメントする

削除パスワード

No.4978

Re:main関数を分割
投稿者---aaa(2005/11/28 03:10:55)


>ざっとみて、
>int g=9.8;
>はおかしいのでは?
たしかにおかしいです俺がバカでした。今doubleになおしました。
gは重力を意味しているのですがC++でgを画像として使うので定義しませんでした。
doubleになおしてもエラーがなおりません。エラーの内容は浮動小数点の不正な使用となるのですがどこが悪いのでしょうか?


>一応ソースだけでなくて、何をやっているソースなのか説明がほしいと思いますけど。
>意味合い的にドコで関数化させるかとかが重要なので。

分けたい部分はルンゲクッタ法の計算をしたいのです。
ちなみにfunc_f〜func_jまではある力学的な方程式です。



この投稿にコメントする

削除パスワード

No.4979

Re:main関数を分割
投稿者---ぽへぇ(2005/11/28 08:04:13)


>エラーの内容は浮動小数点の不正な使用となるのですが
>最初のに比べてどこが悪いのかご指摘をお願いします。

ここ。
> printf("%10.4lf %10.4lf %10.4lf %10.4lf %10.4lf\n",*t,*th1,*th2,*W1,*W2);

なんでもかんでも*を付ければ良いというものでもない。



この投稿にコメントする

削除パスワード

No.4981

Re:main関数を分割
投稿者---aaa(2005/11/28 12:56:00)


>なんでもかんでも*を付ければ良いというものでもない。
そうだったんですか(汗)
ご指摘いただきありがとうございました。


この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity