ページ 11

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

Posted: 2012年2月01日(水) 16:00
by 勉強中
大学の課題でプログラムを組んでいます。ループがうまくいかないので教えて下さい。
オイラー法のプログラムです。

#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なのにもかかわらず処理をしてしまいます。

Posted: 2012年2月01日(水) 16:05
by 勉強中
ごめんなさい。
ソース貼りなおします

コード:

#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;
}

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

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

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

Posted: 2012年2月01日(水) 16:27
by 勉強中
アドバイス通りにソースを改変したらできました。
ありがとうございました。

コード:

#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;
}