c 199938042 박상일c 사용 프로그램 compaq visual fortran 6.1c quadratic spline 법을 이용하여 임의의 점에 대한 함수값을 구하고자 한다.c ==============================< structure >======================================c 교차점의 함수값과 일차미분값이 일치하고, 이차미분값이 0임을 이용하여 방정식의c 계수 a,b,c를 구하고, 이를 구하고자 하는 방정식에 대입하여 x값의 함수값을 구한다.c==========================< 구하고자 하는 임의의 방정식 >=========================c y=a(i)*(x-x(i))+b(i)c==================================================================================program quadraticspline ! 프로그램 선언implicit none ! 변수 초기화integer :: i,n ! 변수선언 / 배열선언real :: xi,yireal, allocatable, dimension(:) :: x,ywrite(*,*)"함수값의 갯수 n을 입력하시오."read (*,*) n ! 함수값의 갯수 입력allocate(x(1:n),y(1:n))write(*,*)"주어진 x값을 입력하시오."read (*,*) x(1:n) ! 주어진 x값 입력write(*,*)"주어진 함수값 f(x)를 입력하시오."read (*,*) y(1:n) ! 주어진 함수값 y 입력write(*,*)"구하고자 하는 x값을 입력하시오."read (*,*) xi ! 구하고자 하는 x값 입력call quadratic(n,x,y,xi,yi) ! subroutine quadratic함수 부름write(*,*)"구하고자 하는 함수값은", yi,"이다."! 구하고자 하는 함수값 yi 출력end program ! 프로그램 종료subroutine quadratic(n,x,y,xi,yi) ! subroutine quadratic 선언implicit none ! 변수 초기화integer :: i,n ! 변수선언 / 배열선언real :: xi,yireal,dimension(1:n) :: x,y,hreal,dimension(1:n) :: a,b,cdo i=1,n-1,1 ! 주어진 n개의 x값의 구간은 n-1개h(i)=x(i+1)-x(i) ! x값의 차이를 h로 치환end do! 방정식의 계수 중 첫번째 값 정의c(1)=y(1)b(1)=(y(2)-c(1))/h(1)a(1)=0 ! 이치미분값이 0인 조건에서do i=2,n-1,1 ! 나머지 계수값 모두 정의c(i)=y(i) ! 교차점의 함수값과 일차미분값이 일치하는 조건에서b(i)=2*a(i-1)*h(i-1)+b(i-1)a(i)=(y(i+1)-c(i)-b(i)*h(i))/h(i)**2
c 199938042 박상일c 사용 프로그램 compaq visual fortran 6.1c linear spline 법을 이용하여 임의의 점에 대한 함수값을 구하고자 한다.c ==============================< structure >======================================c 교차점의 함수값이 일치하는 조건을 이용하여 방정식의 계수 a,b를 구하고, 이를c 구하고자 하는 방정식에 대입하여 x값의 함수값을 구한다.c==========================< 구하고자 하는 임의의 방정식 >=========================c y=a(i)*(x-x(i))+b(i)c==================================================================================program linearspline ! 프로그램 선언implicit none ! 변수 초기화integer :: i,n ! 변수선언 / 배열선언real :: xi,yireal, allocatable, dimension(:) :: x,ywrite(*,*)"함수값의 갯수 n을 입력하시오."read (*,*) n ! 함수값의 갯수 입력allocate(x(1:n),y(1:n))write(*,*)"주어진 x값을 입력하시오."read (*,*) x(1:n) ! 주어진 x값 입력write(*,*)"주어진 함수값 f(x)를 입력하세요!"read (*,*) y(1:n) ! 주어진 함수값 y 입력write(*,*)"구하고자 하는 x값을 입력하세요!"read (*,*) xi ! 구하고자 하는 x값 입력call linear(n,x,y,xi,yi) ! subroutine linear함수 부름write(*,*)"구하고자 하는 함수값은", yi,"이다."! 구하고자 하는 함수값 yi 출력end program ! 프로그램 종료subroutine linear(n,x,y,xi,yi) ! subroutine linear 선언implicit none ! 변수 초기화integer :: i,n ! 변수선언 / 배열선언real :: xi,yireal,dimension(1:n) :: x,yreal,dimension(1:n) :: a,bdo i=1,n-1,1 ! 방정식의 계수 정의b(i)=y(i) ! x(i)에서의 함수값이 y(i)임을 이용a(i)=(y(i+1)-y(i))/(x(i+1)-x(i))! 교차점의 함수값이 일치함을 이용
c 199938042 박상일c 사용 프로그램 compaq visual fortran 6.1c cubic spline 법을 이용하여 임의의 점에 대한 함수값을 구하는 프로그래밍.c ==============================< structure >======================================c condition1,2,3에 따른 s의 값을 TDMA법을 활용하여 구하고, s에 관한 식으로 표현되는c 방정식의 계수 a,b,c,d를 구하고자 하는 방정식에 대입하여 x값의 함수값을 구한다.c==========================< 구하고자 하는 임의의 방정식 >=========================c y=a(i)*(x-x(i))**3+b(i)*(x-x(i))**2+c(i)*(x-x(i))+d(i)c==================================================================================program cubicspline ! 프로그램 선언implicit none ! 변수 초기화integer :: i,n ! 변수선언 / 배열선언real :: xi,yi1,yi2,yi3real, allocatable, dimension(:) :: x,ywrite(*,*)"함수값의 갯수 n을 입력하시오."read (*,*) n ! 주어진 함수값의 갯수 입력allocate(x(1:n),y(1:n)) ! x,y 의 배열 할당write(*,*)"주어진 x값을 입력하시오."read (*,*) x(1:n) ! 주어진 x 값 입력write(*,*)"주어진 함수값 f(x)를 입력하시오."read (*,*) y(1:n) ! 주어진 y 값 입력write(*,*)"구하고자 하는 x값을 입력하세요!"read (*,*) xi ! 구하고자 하는 xi값 입력call condition1(x,y,xi,yi1,n) ! subroutine condition1,2,3를 부름call condition2(x,y,xi,yi2,n)call condition3(x,y,xi,yi3,n)write(*,*)"*******************************************************"write(*,*)"condition1: 구하고자 하는 함수값은", yi1,"이다."write(*,*)"condition2: 구하고자 하는 함수값은", yi2,"이다."write(*,*)"condition3: 구하고자 하는 함수값은", yi3,"이다."write(*,*)"*******************************************************"end program ! 프로그램 종료!---------------------------------------------------! condition1,2,3의 값을 구하기 위해 TDMA법을 활용!---------------------------------------------------!--------< conndition1 >----------------------------subroutine condition1(x,y,xi,yi1,n) ! subroutine condition1 선언implicit none ! 변수 초기화integer i,k,n ! 변수선언 / 배열선언real xi,yi1real , dimension(1:n):: x,y,h,a,b,c,d,sreal , dimension(1:(n-2)):: r,f,ureal , dimension(2:(n-2)):: ereal , dimension(1:(n-3)):: gdo i=1,n-1,1 ! n개의 함수값의 구간은 n-1개이다.h(i)=x(i+1)-x(i) ! 주어진 x값의 차이를 h로 치환end dof(1)=2*(h(1)+h(2)) ! 대각행렬의 첫번째 행의 f,g값 정의g(1)=h(2)r(1)=6*((y(3)-y(2))/h(2)-(y(2)-y(1))/h(1)) ! 우변의 r값 정의do i=2,n-3,1e(i)=h(i) ! 대각행렬의 두번째 행부터 n-3번재 행까지의 e,f,g값 정의f(i)=2*(h(i)+h(i+1))g(i)=h(i+1)r(i)=6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i))end doe(n-2)=h(n-2) ! 대각행렬의 마지막 행의 e,f값 정의f(n-2)=2*(h(n-2)+h(n-1))r(n-2)=6*((y(n)-y(n-1))/h(n-1)-(y(n-1)-y(n-2))/h(n-2))!-------(TDMA를 활용한 대각행렬 해법)-------!(1,n-2)범위의 u값을 먼저 정의하고 이 값을 (2,n-1)범위의 값 s로 치환한다.do k=2,n-2 ! decompositione(k)=e(k)/f(k-1)f(k)=f(k)-e(k)*g(k-1)end dodo k=2,n-2 ! forward substitutionr(k)=r(k)-e(k)*r(k-1)end dou(n-2)=r(n-2)/f(n-2)do k=n-3,1,-1 ! back substitutionu(k)=(r(k)-g(k)*u(k+1))/f(k)end dodo k=1,n-2 ! u값을 s값으로 치환s(k+1)=u(k)end dos(1)=0 ! condition1의 조건s(n)=0do i=1,n-1,1 ! 방정식의 계수값 정의d(i)=y(i)b(i)=s(i)/2a(i)=(s(i+1)-s(i))/(6*h(i))c(i)=(y(i+1)-y(i))/h(i)-(2*h(i)*s(i)+h(i)*s(i+1))/6end dodo i=1,n-1,1if (xi>=x(i) .and. xi=x(i) .and. xi
program gauss_seidel_iterationc 199938042 박상일c compaq visual fortran 6.1 (fortran77)c gauss_seidel 과 relaxtion method를 한번에 돌릴 수 있도록 했습니다.real a(30,30),x(30),xold(30),b(30)real es,eps(30),suminteger iter,itmaxcharacter slectionc input number of equationswrite(*,*)'####### gauss_seidel_iteration #######'write(*,*)' 'write(*,*) '방정식의 수를 넣으시오(n):'read(*,*) nc input coefficient of equations-a(n,n)write(*,*)'**************************************************'write(*,*)'A sufficent condition for convergence is diagonal& dominant'write(*,*)'**************************************************'10 write(*,*)'방정식의 각각의 계수를 넣으시오!'do i=1,nwrite(*,*)'****equation:',iread(*,*)(a(i,j),j=1,n),b(i)end doc 처음부터 diagonal dominant하게 입력 받는 소스c do i=1,nc sum=0c do j=1,nc if(j .ne. i) sum=sum+abs(a(i,j))c end doc if(abs(a(i,i)) .le. sum) thenc write(*,*)'A coefficient matrix is diagonal dominant'c write(*,*)'Change sequence of equation'c goto 10c end ifc end doc input itmax and es,initial values(x1,x2,...xn)write(*,*)'초기값을 넣으시오!(x1,x2....xn)'read(*,*)(x(i),i=1,n)write(*,*)'에러와 반복횟수를 넣으시오!'read(*,*)es,itmaxc input relaxtion coefficient20 write(*,*)'relaxtion method을 사용하시겠습니까?(Y or N)'read(*,*)slectionif(slection .ne. 'y' .and. slection .ne. 'n') thenwrite(*,*)'************Y or N***************'goto 20end if30 if(slection .eq. 'y') thenwrite(*,*)'relaxtion coefficient(w)를 넣으시오:'read(*,*)wend ifif(w .lt. 0. .or. w .gt. 2.) thenwrite(*,*)'input error:*******0=