블로그 이미지
제시카

안녕 !

Rss feed Tistory
신변잡기/공대딩 2009. 4. 2. 19:53

수치해석 MATLAB으로 테일러 전개로 sin(x)의 값을 근사하라.


f=sin(pi/4); %구하고 싶은 함수. 참값.

x=1; %func값을 알고있을 때의 x값

j=0; %while 구문을 0부터 실행한다.

n=3; %유효숫자 개수

eps_s=0.5*10^(2-n);

known=1;

unknown=pi/4;

func=0; %테일러함수 func를 초기화한다.

func_before=0; %이전 테일러함수 func_before를 초기화한다.

fprintf ('terms\t근사오차\t  상대오차\t   함수값\n')

while j<100 %초항 0부터 100항까지 반복

if mod(j,4)==0

plusfunc=sin(x); %0,4,8.. 항은 sinx

elseif mod(j,4)==1

plusfunc=cos(x); %1,5,9.. 항은 cosx

elseif mod(j,4)==2

plusfunc=-sin(x); %2,6,10.. 항은 -sinx

else

plusfunc=-cos(x); %3,7,11.. 항은 -cosx

end

func=func+plusfunc/factorial(j)*((unknown-known)^j); %테일러급수전개.

eps_a=(func-func_before)/func*100; %근사오차 = (현재값-이전값)/현재값

eps_t=(f-func)/f*100; %상대오차 = (참값-현재값)/참값

fprintf('%2.0f\t%2.7f\t%2.7f\t%2.7f\n', j,eps_a,eps_t,func)

%각 회수마다 상대오차, 근사오차, 함수값을 출력한다.

if abs(eps_a) < eps_s

break %근사오차가 백분율허용치보다 작아지면 멈춘다.

end

func_before=func; %이전값을 현재 값으로 교체한다.

j=j+1; %회수를 1회 증가한다.

end

fprintf('\n실제값 : %2.10f, ',f)

fprintf('근사값 : %2.10f',func)

결과

terms

근사오차

상대오차

함수값

0

100.0000000

-19.0019679

0.8414710

1

-15.9815978

-2.6041804

0.7255211

2

-2.7439891

0.1360748

0.7061446

3

0.1258767

0.0102110

0.7070346

4

0.0105166

-0.0003056

0.7071089


매트랩은 처음 다뤄봐서 코딩이 다소 지저분한 듯도 하다.
어쨌든 결과값은 제대로 출력 되는듯 :)
,
TOTAL TODAY