ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.04.2021
Просмотров: 734
Скачиваний: 1
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
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
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
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
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