大学の課題で困ってます。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
勉強中

大学の課題で困ってます。

#1

投稿記事 by 勉強中 » 14年前

大学の課題でプログラムを組んでいます。ループがうまくいかないので教えて下さい。
オイラー法のプログラムです。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{

double t=0;
double tmax=3;
double h=0.01;
double *x;
int i=0;

x=(double*)malloc(sizeof(double) * tmax/h);

x[0]=0; //x(0)=0を代入

while(t<tmax){
if(i+1!=tmax/h)
x[i+1]=x+2*t*h;

printf("x(%d)=%.3f 厳密解 %.3f %f\n",i,x,pow(t,2),t);
i++;
t+=h;
}

free(x);

return 0;
}

while(t<tmax)のとこですがtmax=3なのですがt=3なのにもかかわらず処理をしてしまいます。

勉強中

#2

投稿記事 by 勉強中 » 14年前

ごめんなさい。
ソース貼りなおします

コード:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{

  double t=0;
  double tmax=3;
  double h=0.1;
  double *x;
  int i=0;

  x=(double*)malloc(sizeof(double) * tmax/h);

  x[0]=0;   //x(0)=0を代入

  while(t<tmax){
	   if(i+1!=tmax/h)
	 x[i+1]=x[i]+2*t*h;

     printf("x(%d)=%.3f  厳密解 %.3f  %f\n",i,x[i],pow(t,2),t);
	 i++;
	 t+=h;
    }

  free(x);

  return 0;
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 大学の課題で困ってます。

#3

投稿記事 by beatle » 14年前

tはdouble型の変数ですので,誤差が発生するのはご存知ですか?0.01づつ足しているつもりでも,内部的には微妙な誤差が発生しています.
もしかしたら,t=3のように見えて実は3より少しだけ小さい数なのかもしれません.
正確に○○回繰り返す必要があるなら,条件判断に使う変数は整数型を使いましょう.

勉強中

Re: 大学の課題で困ってます。

#4

投稿記事 by 勉強中 » 14年前

アドバイス通りにソースを改変したらできました。
ありがとうございました。

コード:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{

  double t=0;
  double tmax=3;
  double h=0.01;
  double *x;
  int i=0;

  x=(double*)malloc(sizeof(double) * tmax/h);

  x[0]=0;   //x(0)=0を代入

  while(i<(int)(tmax/h)){
	   if(i+1!=tmax/h)
	 x[i+1]=x[i]+2*t*h;

     printf("x(%d)=%.3f  厳密解 %.3f  %f\n",i,x[i],pow(t,2),t);
	 i++;
	 t+=h;
    }

  free(x);

  return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る