소개글
<초기치 문제> 숙제입니다. 문제가 쓰여있진 않지만 자세한 풀이와 코드가 쓰여있습니다.
목차
없음
본문내용
►문제 1번rnrn이 문제는 2계 상미분 방정식 형태이므로 우선 1계 상미분 방정식 형태로 바꿔보겠다.
rnrny=y_1,(dy_1)/dt=y_2 로 치환해서 대입하면rnrn(dy_2)/dt+3ty_2-6y_1=5 , t=0 일 때 y_(1,0)=0,〖 y〗_(2,0)=0rnrnt=0.1 일 때 (h=0.1 가정)rnrn〖y_(2,0.1)〗^p=y_(2,0)+hf_(2,0)=0+0.1(5-3t×0+6×0)=0.5rn〖y_(1,0.1)〗^p=y_(1,0)+hf_(1,0)=0+0.1×(0)=0rnrn〖f_(2,0.1)〗^p=5-3×(0.1)×(0.5)+6×(0)=4.85rn〖f_(1,0.1)〗^p=0.5rnrn〖y_(2,0.1)〗^c=y_(2,0)+h/2 (f_(2,0)+f_(2,0.1) )=0+(0.05)×(5+4.85)=0.4925rn〖y_(1,0.1)〗^c=y_(1,0)+h/2 (f_(1,0)+f_(1,0.1) )=0+(0.05)×(0+0.5)=0.025rnrn
이제 이 과정을 반복해서 문제에서 구하고자 하는 〖y_(1,0.4)〗^c,〖〖 y〗_(2,0.4)〗^c 를 구하면 된다.
rnrn#include <stdio.h>rn#include <math.h>rnrnvoid main()rn{rn double h =0.05, n, t;rn double y1=0, y2=0, yc1 = 0, yc2=0, yp=0, yp2=0, f1, f2, f11, f22;rn rn n=0;rn t=0;rn printf("n");rn printf("t y(t) y`(t)n");rn do rn { rn yp2 = y2 + h*(5-3*t*y2+6*y1);rn yp = y1 + h*y2;rn f2 = 5 - 3*t*y2 + 6*y1;rn f1 = y2;rn t= t+h;rn f22 = 5 - 3*t*yp2 + 6*yp;rn f11 = yp2;rnrn yc2 = y2 + h*(f2+f22)*0.5; rn yc1 = y1 + h*(f11+f1)*0.5; rn y2 = yc2;rn y1 = yc1;rn printf("%g %lf %lfn", t, y1, y2);rn n++; rn }rn while(t<0.4); rn}rnrn이번에는 h를 0.01,0.05 로 가정해서 각각 풀어보겠다.
rnrnh=0.01 일 때rnrnh=0.05 일 때rnrn구간간격 0.1에서 손으로 풀었을 때와 계산값이 완벽히 일치함을 화면으로 확인할 수 있었다.
또한 위의 표에서 비교해보면 h값이 작아짐에 따라 보다 정확한 값을 구할 수 있었다.
엄밀해도 구해서 오차까지 비교해보고 싶었으나 문제에 주어진 식을 라플라스 변환으로 풀어내기엔 꽤나 상당한 수준의 수학실력을 요구했기 때문에 안타깝게도 엄밀해까지 구해보지는 못했다.
그러나 h가 작아질수록 계산횟수는 증가하고, 결과값은 엄밀해에 근접해갈 것이라고 생각할 수는 있었다.
하지만 계산횟수가 증가할수록 마무리오차가 커지기 때문에 무조건적으로 연산수를 늘려서 결과값을 구하기보다는 적정한 범위에서 h를 정한 후 원하는 오차범위내의 결과값을 구하는 것이 좋을 것이다.
참고 자료
없음