글
신변잡기/공대딩 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 |
매트랩은 처음 다뤄봐서 코딩이 다소 지저분한 듯도 하다.
어쨌든 결과값은 제대로 출력 되는듯 :)
RECENT COMMENT