목차
1. 다음 초기치 문제를 0t 2에서 구간간격을 h=0.1로 하여 Taylor 급수법으로 풀어라.
만약 엄밀해가 존재한다면 그 해와 수치결과를 비교하라.
2. 다음 초기치 문제를 0t 2에서 구간간격을 h=0.1과 h=0.01로 하여 Euler 법의 양함수법과 음함수법으로 각각 풀어라. 또한, Euler법의 양함수법으로 풀 때 구간간격을 얼마 이하로 하여야만 수치해가 안정되는지를 조사하여라.
3. 문제 2를 수정 Euler 법으로 다시 풀어라.
9. 다음 초기치 문제를 구간 0t 10에서 구간간격을 h=0.1로 하여 4계 Runge-Kutta법으로 풀어라. 또한, 적응 구간간격 제어를 이용하여 Runge-Kutta-Fehlberg법으로 풀어라. 단, 적응구간간격 제어를 이용할 때 최대허용오차는 0.05%이고 최소허용오차는 0.005%이다.
만약 엄밀해가 존재한다면 그 해와 수치결과를 비교하라.
2. 다음 초기치 문제를 0t 2에서 구간간격을 h=0.1과 h=0.01로 하여 Euler 법의 양함수법과 음함수법으로 각각 풀어라. 또한, Euler법의 양함수법으로 풀 때 구간간격을 얼마 이하로 하여야만 수치해가 안정되는지를 조사하여라.
3. 문제 2를 수정 Euler 법으로 다시 풀어라.
9. 다음 초기치 문제를 구간 0t 10에서 구간간격을 h=0.1로 하여 4계 Runge-Kutta법으로 풀어라. 또한, 적응 구간간격 제어를 이용하여 Runge-Kutta-Fehlberg법으로 풀어라. 단, 적응구간간격 제어를 이용할 때 최대허용오차는 0.05%이고 최소허용오차는 0.005%이다.
본문내용
rce >
#include
#include
void main()
{
int i=0;
double j,t,h=0,yr,E;
double y[2000]={0};
y[0]=2;
printf(" \n***Euler법으로 풀어보기!!***\n");
printf(" \n(2) 음함수법 \n");
printf(" \n y(0)값을 입력하세요 ",y[0]); scanf("%d",&y[0]);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0;t<0.1;t=t+0.01)
{
j=t;
j=t+0.01;
y[i+1]=(y[i]+h*j-h*j*j)/(1-4*h);
i=i+1;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t+0.01,y[i]);
yr=1.90625*exp(4*(t+0.01))+0.09375-0.125*(t+0.01)+0.25*(t+0.01)*(t+0.01);
E=fabs(yr-y[i])*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
3. 문제 2를 수정 Euler 법으로 다시 풀어라.
y' - 4y = t - t2, y(0) = 2
*** h=0.1 일 때의 Source ***
< C++ Source >
#include
#include
void main()
{
int i=0;
double y0,t,yp,yt,yc,f,h,yr,E;
printf(" \n***수정 Euler법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.1;t<2.1;t=t+0.1)
{
f=4*y0+(t-0.1)-(t-0.1)*(t-0.1);
yp=y0+h*f;
yt=4*yp+t-t*t;
yc=y0+0.5*h*(f+yt);
y0=yc;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,yc);
yr=1.90625*exp(4*t)+0.09375-0.125*t+0.25*t*t;
E=fabs(yr-yc)*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
*** h=0.01 일 때의 Source ***
< C++ Source >
#include
#include
void main()
{
int i=0;
double y0,t,yp,yt,yc,f,h,yr,E;
printf(" \n***수정 Euler법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.01;t<2.01;t=t+0.01)
{
f=4*y0+(t-0.01)-(t-0.01)*(t-0.01);
yp=y0+h*f;
yt=4*yp+t-t*t;
yc=y0+0.5*h*(f+yt);
y0=yc;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,yc);
yr=1.90625*exp(4*t)+0.09375-0.125*t+0.25*t*t;
E=fabs(yr-yc)*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
(너무 길어서 중간 생략...)
9. 다음 초기치 문제를 구간 0t 10에서 구간간격을 h=0.1로 하여 4계 Runge-Kutta법으로 풀어라. 또한, 적응 구간간격 제어를 이용하여 Runge-Kutta-Fehlberg법으로 풀어라. 단, 적응구간간격 제어를 이용할 때 최대허용오차는 0.05%이고 최소허용오차는 0.005%이다.
(d) y' - y = 1 - sin t + e-t, y(0) = 0
< C++ Source >
#include
#include
void main()
{
int i=0;
double k[4]={0};
double t,t2,y0=0,y2,f,h=0,y,yr,E;
printf(" \n***Runge-Kutta법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.1;t<10;t=t+0.1)
{
f=y0+1-sin(t-0.1)+exp(-1*(t-0.1));
k[0]=f;
t2=(t-0.1)+0.5*h;
y2=y0+0.5*h*k[0];
f=y2+1-sin(t2)+exp(-1*t2);
k[1]=f;
y2=y0+0.5*h*k[1];
f=y2+1-sin(t2)+exp(-1*t2);
k[2]=f;
t2=(t-0.1)+h;
y2=y0+h*k[2];
f=y2+1-sin(t2)+exp(-1*t2);
k[3]=f;
y=y0+h*(k[0]+2*(k[1]+k[2])+k[3])/6;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,y);
yr=exp(t)-0.5*exp(-1*t)+0.5*cos(t)+0.5*sin(t)-1;
E=fabs((yr-y)/yr)*100;
printf("\n엄밀해는 %lf 이며, 상대오차는 %lf 퍼센트입니다.\n",yr,E);
y0=y;
}
}
(너무 길어서 중간생략....)
#include
#include
void main()
{
int i=0;
double j,t,h=0,yr,E;
double y[2000]={0};
y[0]=2;
printf(" \n***Euler법으로 풀어보기!!***\n");
printf(" \n(2) 음함수법 \n");
printf(" \n y(0)값을 입력하세요 ",y[0]); scanf("%d",&y[0]);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0;t<0.1;t=t+0.01)
{
j=t;
j=t+0.01;
y[i+1]=(y[i]+h*j-h*j*j)/(1-4*h);
i=i+1;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t+0.01,y[i]);
yr=1.90625*exp(4*(t+0.01))+0.09375-0.125*(t+0.01)+0.25*(t+0.01)*(t+0.01);
E=fabs(yr-y[i])*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
3. 문제 2를 수정 Euler 법으로 다시 풀어라.
y' - 4y = t - t2, y(0) = 2
*** h=0.1 일 때의 Source ***
< C++ Source >
#include
#include
void main()
{
int i=0;
double y0,t,yp,yt,yc,f,h,yr,E;
printf(" \n***수정 Euler법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.1;t<2.1;t=t+0.1)
{
f=4*y0+(t-0.1)-(t-0.1)*(t-0.1);
yp=y0+h*f;
yt=4*yp+t-t*t;
yc=y0+0.5*h*(f+yt);
y0=yc;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,yc);
yr=1.90625*exp(4*t)+0.09375-0.125*t+0.25*t*t;
E=fabs(yr-yc)*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
*** h=0.01 일 때의 Source ***
< C++ Source >
#include
#include
void main()
{
int i=0;
double y0,t,yp,yt,yc,f,h,yr,E;
printf(" \n***수정 Euler법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.01;t<2.01;t=t+0.01)
{
f=4*y0+(t-0.01)-(t-0.01)*(t-0.01);
yp=y0+h*f;
yt=4*yp+t-t*t;
yc=y0+0.5*h*(f+yt);
y0=yc;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,yc);
yr=1.90625*exp(4*t)+0.09375-0.125*t+0.25*t*t;
E=fabs(yr-yc)*100/yr;
printf("\n엄밀해는 %lf이고 상대오차는 %lf 퍼센트입니다.\n",yr,E);
}
}
(너무 길어서 중간 생략...)
9. 다음 초기치 문제를 구간 0t 10에서 구간간격을 h=0.1로 하여 4계 Runge-Kutta법으로 풀어라. 또한, 적응 구간간격 제어를 이용하여 Runge-Kutta-Fehlberg법으로 풀어라. 단, 적응구간간격 제어를 이용할 때 최대허용오차는 0.05%이고 최소허용오차는 0.005%이다.
(d) y' - y = 1 - sin t + e-t, y(0) = 0
< C++ Source >
#include
#include
void main()
{
int i=0;
double k[4]={0};
double t,t2,y0=0,y2,f,h=0,y,yr,E;
printf(" \n***Runge-Kutta법으로 풀어보기!!***\n");
printf(" \n y(0)값을 입력하세요 ",y0); scanf("%lf",&y0);
printf(" \n 구간간격 h 값을 입력하세요 ",h); scanf("%lf",&h);
printf(" \n =============================================\n ");
for (t=0.1;t<10;t=t+0.1)
{
f=y0+1-sin(t-0.1)+exp(-1*(t-0.1));
k[0]=f;
t2=(t-0.1)+0.5*h;
y2=y0+0.5*h*k[0];
f=y2+1-sin(t2)+exp(-1*t2);
k[1]=f;
y2=y0+0.5*h*k[1];
f=y2+1-sin(t2)+exp(-1*t2);
k[2]=f;
t2=(t-0.1)+h;
y2=y0+h*k[2];
f=y2+1-sin(t2)+exp(-1*t2);
k[3]=f;
y=y0+h*(k[0]+2*(k[1]+k[2])+k[3])/6;
printf("\n t가 %lf 일 때 함수 값은 %lf 입니다.",t,y);
yr=exp(t)-0.5*exp(-1*t)+0.5*cos(t)+0.5*sin(t)-1;
E=fabs((yr-y)/yr)*100;
printf("\n엄밀해는 %lf 이며, 상대오차는 %lf 퍼센트입니다.\n",yr,E);
y0=y;
}
}
(너무 길어서 중간생략....)