Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 651 / 76 | Длительность: 06:01:00
Тема: Программирование
Специальности: Системный архитектор, Тестировщик
Теги:
Лекция 4:
Массивы
Задание
Методом конечных разностей решить уравнение Лапласа в прямоугольной области.
Точное решение
Условия на границах.
В расчетной программе, кроме внешнего цикла по итерациям, исключить циклы.
использовать сечения массивов и векторные индексы.
Обтекание уступа.
Построим расчетную сетку.
Аппроксимируем уравнение Лапласа центральными разностями.
Систему линейных алгебраических уравнений решаем итерационным методом верхней релаксации.
Решение на следующей итерации.
Условие окончания итерационного процесса.
На стенках заданы условия 1-го рода, протабулируем функции вдоль каждой стенки.
Алгоритм решения уравнения Лапласа.
Вариант программы
program Laplace integer, parameter :: Mi=40, Mj=40 real(8) :: f(Mi,Mj)=0.0d0, fn, fold integer iter real(8), parameter :: eps=1.0d-4 real(8), parameter :: relax=1.5d0 real(8) :: dx, dy, cx=1.0d0 dx=2*acos(0.0)/(Mi-1) dy=2.0/(Mj-1) ! --- граничные условия do i=1,Mi xt=(i-1)*dx f(i,1) =exp(-1.0)*sin(xt) f(i,Mj)=exp( 1.0)*sin(xt) end do ! --- расчет уравнения Лапласа iter=0 do while(cx>eps) iter=iter+1 cx=0.0d0 do i=2,Mi-1 do j=2,Mj-1 fn=( (f(i+1,j)+f(i-1,j))/(dx*dx) + & (f(i,j+1)+f(i,j-1))/(dy*dy) ) / & (2/(dx*dx)+2/(dy*dy)) fold=f(i,j) f(i,j)=relax*fn+(1.0-relax)*f(i,j) cx=cx+abs(f(i,j)-fold) end do end do end do
! --- проверка с точным решением cx=0.0d0 do i=1,Mi xt=(i-1)*dx do j=1,Mj yt=(j-1)*dy-1.0 cx=cx+abs(f(i,j)-exp(yt)*sin(xt)) end do end do write(*,*) "Total = ", cx, " Iterations = ", iter end
Результат работы программы.
Total = 0.188578398541204 Iterations = 619 Для продолжения нажмите любую клавишу . . .