본문 바로가기

IT/Numerical analysis

테일러(Taylor) 급수 C언어로 구하기

무한 급수 중에 테일러(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();
}