Файл: Вычислительный эксперимент и методы вычислений.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.04.2021

Просмотров: 734

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

do i=1, n

s=0.0
do j=1, n

s=s+a(i,j)*x(j)

end do
if (abs(s-b(i))<eps) then

write (*,*) "stroka", i, "OK"

else

write (*,*) "stroka", i, "is wrong", s, b(i)

end if

end do

end subroutine
end program Gauss_zeid

7.5.

Решение задачи Коши для ОДУ

! Программа решения ОДУ (dy/dx=f(x,y)) методом Эйлера
! начальные данные - a,b - отрезок, на котором ищется решение
! h - шаг изменения функции
! y(a) - начальное значение
! В результате работы программы получается массивы x(n) и y(n)

-решение

program eiler
implicit none
integer i, n
real*8 h, a, b
real*8, dimension(:), allocatable :: x, y

write(*,*) "Введите a, b -границы отрезка построения y(x)"
read (*,*) a, b
write(*,*) "Введите h -шаг"
read (*,*) h
n=(b-a)/h
allocate (x(0:n), y(0:n))
x(0)=a
write(*,*) "Введите y(x0)"
read (*,*) y(0)
do i=1, n

x(i)=x(i-1)+h
y(i)=y(i-1)+h*f(x(i-1), y(i-1))

end do

86


background image

open (1, file="graph.dat")
do i=0, n

write (*,*) i, x(i), y(i) !вывод на экран
write (1, *) i, x(i), y(i) !вывод в файл для построения графика

end do
close(1)

contains

!функция f
real*8 function f(x, y)
real*8 x, y

f=sin(x)-y

end function
end program eiler

! Программа решения ОДУ (dy/dx=f(x,y)) модифицированным мето-

дом Эйлера

! начальные данные - a,b - отрезок, на котором ищется решение
! h - шаг изменения функции
! y(a) - начальное значение
! В результате работы программы получается массивы x(n) и y(n)

-решение

program eiler_mod
implicit none
integer i, n
real*8 h, a, b
real*8, dimension(:), allocatable :: x, y

write(*,*) "Введите a, b -границы отрезка построения y(x)"
read (*,*) a, b
write(*,*) "Введите h -шаг"
read (*,*) h
n=(b-a)/h
allocate (x(0:n), y(0:n))
x(0)=a
write(*,*) "Введите y(x0)"
read (*,*) y(0)
do i=1, n

x(i)=x(i-1)+h
y(i)=y(i-1)+h*f(x(i-1)+h/2, y(i-1)+h*f(x(i-1),y(i-1))/2)

end do
open (1, file="graph.dat")

87


background image

do i=0, n

write (*,*) i, x(i), y(i) !вывод на экран
write (1, *) i, x(i), y(i) !вывод в файл для построения графика

end do
close(1)

contains

!функция f
real*8 function f(x, y)
real*8 x, y

f=sin(x)-y

end function
end program eiler_mod

! Программа решения ОДУ (dy/dx=f(x,y)) методом Эйлера с пере-

счетом

! начальные данные - a,b - отрезок, на котором ищется решение
!h - шаг изменения функции
!y(a) - начальное значение
! В результате работы программы получается массивы x(n) и y(n)

-решение

program eiler_per
implicit none
integer i, n
real*8 h, a, b
real*8, dimension(:), allocatable :: x, y

write(*,*) "Введите a, b -границы отрезка построения y(x)"
read (*,*) a, b
write(*,*) "Введите h -шаг"
read (*,*) h
n=(b-a)/h
allocate (x(0:n), y(0:n))
x(0)=a
write(*,*) "Введите y(x0)"
read (*,*) y(0)
do i=1, n

x(i)=x(i-1)+h
y(i)=y(i-1)+h/2*(f(x(i-1), y(i-1))+f(x(i), y(i-1))+h*f(x(i-1), y(i-

1)))

end do

88


background image

open (1, file="graph.dat")
do i=0, n

write (*,*) i, x(i), y(i) !вывод на экран
write (1, *) i, x(i), y(i) !вывод в файл для построения графика

end do
close(1)

contains

!функция f
real*8 function f(x, y)
real*8 x, y

f=sin(x)-y

end function
end program eiler_per

! Программа решения ОДУ (dy/dx=f(x,y)) методом Рунге-Кутты 4

порядка

! начальные данные - a,b - отрезок, на котором ищется решение
! h - шаг изменения функции
! y(a) - начальное значение
! В результате работы программы получается массивы x(n) и y(n)

-решение

program runge4
implicit none
integer i, n
real*8 h, a, b, k(0:3)
real*8, dimension(:), allocatable :: x, y

write(*,*) "Введите a, b -границы отрезка построения y(x)"
read (*,*) a, b
write(*,*) "Введите h -шаг"
read (*,*) h
n=(b-a)/h
allocate (x(0:n), y(0:n))
x(0)=a
write(*,*) "Введите y(x0)"
read (*,*) y(0)
do i=1, n

x(i)=x(i-1)+h
k(0)=f(x(i-1), y(i-1))
k(1)=f(x(i-1)+h/2, y(i-1)+h*k(0)/2)

89


background image

k(2)=f(x(i-1)+h/2, y(i-1)+h*k(1)/2)
k(3)=f(x(i-1)+h, y(i-1)+h*k(2))
y(i)=y(i-1)+h/6*(k(0)+2*k(1)+2*k(2)+k(3))

end do
open (1, file="graph.dat")
do i=0, n

write (*,*) i, x(i), y(i) !вывод на экран
write (1, *) i, x(i), y(i) !вывод в файл для построения графика

end do
close(1)

contains
real*8 function f(x, y)
real*8 x, y

f=sin(x)-y

end function
end program runge4

90