메인함수의 반복문을 보면 x=0.4에서 반복문이 종료되어야 하는데 반복문 수행을 한번 더합니다...
그러니까 결과가
x=0.0000 블라블라
x=0.0500 블라블라
...
x=0.4000 블라블라 <----여기까지만 하고 끝나야 되는데
x=0.4000 블라블라 <---- 요게 한번 더 출력됩니다.
도대체 이유를 모르겠습니다. ㅜㅜ
#include "stdafx.h"
#include <math.h>
void Derivs(double x, double y, double* dydx) // 원함수의 1차도함수
{
*dydx = -1000.*y+3000-2000.*exp(-x);
}
void Euler_exp(double x, double y, double h, double* ynew) // explicit 오일러법
{
double dydx; //dydx 변수
Derivs(x,y,&dydx); // 주어진 x값에서 1차미분을 구한다.
*ynew=y+h*dydx; // 1차 테일러 급수로 값 추정
}
void Euler_imp(double x, double y, double h, double* ynew) // implicit 오일러법
{
*ynew = (y+3000.*h-2000.*h*exp(-x-h))/(1+1000.*h);
}
int _tmain(int argc, _TCHAR* argv[])
{
FILE *eu=fopen("euler.txt","w");
double x0=0., xf=0.4, y0=0., h=0.05; // 근사하고자 하는 구간과 각 interval 길이
double x=x0, y_ex=y0, y_im=y0, ynew_ex, ynew_im; //x,y(y는 두가지 방법 각각)
int i=0;
printf("i=%3d x=%15.7e y_ex=%15.7e y_im=%15.7e \n", i,x,y_ex,y_im); fprintf(eu,"i= %3d x= %15.7e y_ex= %15.7e y_im= %15.7e \n", i,x,y_ex,y_im);
do{
Euler_exp(x,y_ex,h,&ynew_ex); // expllicit, 다음 interval에서 y값 추정
Euler_imp(x,y_im,h,&ynew_im); // impllicit, 다음 interval에서 y값 추정
if(xf<x+h) h=xf-x; // 구간 끝점에 맞추기
i++; x=x+h; y_ex=ynew_ex; y_im=ynew_im; // x_i+1, y_i+1 설정
printf("i=%3d x=%15.7e y_ex=%15.7e y_im=%15.7e \n", i,x,y_ex,y_im); fprintf(eu,"i= %3d x= %15.7e y_ex= %15.7e y_im= %15.7e \n", i,x,y_ex,y_im);
}while(x<xf); // 오일러법으로 근사점 구하는 반복문
fclose(eu);
printf("\n\n");
return 0;
}