무한 급수 중에 테일러(Taylor) 급수라는 놈이 있는데, 

 

 f(x)의 값은 f의 테일러 급수의 충분히많은 항들을 더해줌으로써 요구되는 정확도의 범위안에서 근사 시킬수 있다

 

대표적인 간단한 테일러 급수로는




를 들수 있겠다. 

 

과연 n을 무한데로 보내면 e^x 와 숫자와 수렴할까?

 

아래 코딩을 통해 알아보자.

 

x 를 -2.0 에서 2.0 까지 증가시키며 n을 1부터 5까지 증가시키며 원래 e^x 와의 오차를 비교하는 프로그램이다.


#include <stdio.h>
#include <math.h>
// programmed by kaspyx
#define e 2.71828 //e는 근사치로 상수로 정의
double power(double x,int pdg) // x를인자로 받아 pdg 제곱하여 결과를 리턴
{
double pow=1;
if ( pdg == 0)
return 1;
while( pdg >0)
{
pow *=x;
pdg--;
}
return pow;
}
 
double fact(double dg) // dg를 매개변수로 받아서 팩토리얼(!)한 값을 리턴 하는 함수
{
double f=1;
while ( dg > 0 )
{
f *=dg;
dg--;
}
return f;
}
double tprog(double x,double dg) // 1+f(x)/n!+f(x^2)/n!..계산하는함수로 그합을 리턴.
{
double sum=1;
if ( dg == 1)
{
return ( x + 1);
}
while ( dg > 0)
{
sum += (power(x,dg))/(fact(dg));
dg--;
}
return sum;
}
 
double prog_func(int dg)
//x가 -2.0부터 2.0 까지 0.1씩 증가시키며 오차 분석해주는 함수
{
double x = -2.0;
double ex;
double sc;
if ( dg == 0)
return 1;
while ( x <= 2.1)
{
printf("when x = %f ",x);
sc = tprog(x,dg);
ex = (pow(e,x)-(sc))/(pow(e,x));
printf("%f ex = %f and dif ",sc,ex);
if ( ex < 0)
ex *=(-1); //오차는 항상 양수가 나오게함
printf("%f%%",ex*100);
printf("\n");
x+=0.1;
}
return x;
}
void main()
{
int dg = 1;
while ( dg <= 5 ) //degree를 1부터 5까지 반복시킴
{
printf("degree = %d \n",dg);
prog_func(dg);
dg++;
}
getchar();
}


Posted by 캐스피

댓글을 달아 주세요