- •Лабораторная работа № 12 интерполяционный многочлен лагранжа
- •Постановка задачи:
- •Теоретические сведения
- •Типовой вариант
- •Порядок выполнения типового варианта
- •Исходные данные ввести из текстового файла.
- •Содержание работы
- •Лабораторная работа № 12 интерполяционный многочлен лагранжа
- •Постановка задачи
- •Для заданной табличной функции y(X) (результаты эксперимента) построить интерполяционный многочлен Лагранжа .
- •Проверить правильность многочлена Лагранжа , нанеся на график табличную и полиномиальную функции.
- •(Контрольные вопросы – правильные варианты)
Лабораторная работа № 12 интерполяционный многочлен лагранжа
Выполнил |
ст. 211 гр. |
Иванов А.П. |
|
Проверил |
доцент каф. 304 |
Скоб Ю.А. |
|
Цель работы – освоить навыки построения в среде Fortran интерполяционного многочлена Лагранжа для табличной функции Y(x); научиться строить графические программы.
Постановка задачи
Для заданной табличной функции y(X) (результаты эксперимента) построить интерполяционный многочлен Лагранжа .
Проверить правильность многочлена Лагранжа , нанеся на график табличную и полиномиальную функции.
Исходные данные ввести из текстового файла.
Выполнить поставленную задачу в среде программирования Fortran.Вариант № 1
Вариант № 1
Пусть по результатам мониторинга физического процесса в точках X были получены значения измеряемого параметра Y:
-
X
3.2
3.7
4.3
4.9
Y
1.1632
1.3083
1.4586
1.3592
Содержание работы
Текст программы:
program Lagr
use msflib ! подключение модуля стандартных процедур
implicit none ! указание обязательного объявления переменых
!-----------------------------------------------------------
integer,parameter::fi=1 ! устройство ввода
integer,parameter::NT=150 ! количество точек кривой полинома
real(8),parameter::D_X=0.05 ! припуск на диапазон рисования
real(8),parameter::D_Y=0.05 ! припуск на диапазон
real(8) XN,XK,YN,YK,HX ! границы и шаг изменения Х графика
integer i ! счетчик точек полинома
integer n ! количество узлов интерполяции
real(8),allocatable:: XX(:),YY(:) ! массивы узлов интерполяции
real(8) Xmin,Xmax ! минимальный и максимальный элементы X
real(8) Ymin,Ymax ! минимальный и максимальный элементы Y
!-----------------------------------------------------------
logical res ! логический результат графических функций
integer(2) XE, YE ! XE,YE - размеры экрана в пикселях
INTEGER(2) status ! целый результат графических функций
logical(2) finv /.true./ ! Ось у направлена снизу вверх
type(windowconfig) wc ! структура параметров окна
!-----------------------------------------------------------
open(unit=fi,file='Lab12_V1.txt') ! открытие файла данных
read(fi,*) n ! чтение количества узлов интерполяции
allocate(XX(n),YY(n)) ! выделение динамической памяти X и Y
do i=1,n
read(fi,*) XX(i),YY(i) ! чтение координат узлов
enddo
close(fi) ! закрытие файла
!-----------------------------------------------------------
! Автоматическая настройка конфигурации окна
data wc.numxpixels, wc.numypixels, wc.numtextcols, &
wc.numtextrows, wc.numcolors, wc.fontsize / 6*-1 /
wc.title = "Интерполяционный многочлен Лагранжа"C
res = getwindowconfig(wc) ! Читаем параметры видеоокна
XE = wc.numxpixels ! numxpixels - число пикселей по оси х
YE = wc.numypixels ! numypixels - число пикселей по оси у
status = RECTANGLE( $GFILLINTERIOR, INT2(0), INT2(0), XE, YE )
status = setcolor(1_2) ! цвет рамки
status = RECTANGLE( $GBORDER, XE/4_2-20, YE/4_2-20, &
3_2*XE/4_2+20, 3_2*YE/4_2+20)
call axis() ! Рисуем оси координат
! Задание видового порта размером XE/2 * YE/2 в центре видеоокна
call setviewport(XE/4_2, YE/4_2, 3_2*XE/4_2, 3_2*YE/4_2)
! Оконная система координат (ОСК)
!-----------------------------------------------------------
Xmin=MinVal(XX); Xmax=MaxVal(XX) ! поиск минимума и максимума Х
Ymin=MinVal(YY); Ymax=MaxVal(YY) ! поиск минимума и максимума Y
XN=Xmin-D_X ! левая граница Х графика
XK=Xmax+D_X ! правая граница Х графика
YN=Ymin-D_Y ! левая граница Y графика
YK=Ymax+D_Y ! правая граница Y графика
status = setwindow(finv, XN, YN, XK, YK)
call curve() ! Рисуем график
! освобождение динамической памяти
deallocate(XX,YY)
!-----------------------------------------------------------
contains
!******************************************************************
subroutine axis() ! Рисуем оси координат
type(xycoord) xy
status = setcolor( 2_2) ! цвет осей координат
call moveto(int2(XE/4 - 10), int2(YE/2), xy)
status = lineto(3_2*XE/4_2 + 10_2, YE/2_2) ! Ось х
call moveto(int2(XE/2), int2(YE/4 - 10), xy)
status = lineto(XE/2_2, 3_2*YE/4_2 + 10_2) ! Ось y
end subroutine axis
!******************************************************************
subroutine curve() ! График функции у =fx(x)
real(8) x, y !
real(8) X1,X2,Y1,Y2 ! координаты углов маркера узла
integer(2):: color=1_2
status = setcolor(color) ! График функции цветом color
! формирование и рисование маркеров узлов интерполяции
do i=1,n
X1=XX(i)-0.01; X2=XX(i)+0.01
Y1=YY(i)-0.005; Y2=YY(i)+0.005
status = RECTANGLE_w ($GFILLINTERIOR , X1, Y1, X2, Y2)
enddo
! рисование точками графика полинома Лагранжа
color=4_2
HX=(XX(n)-XX(1))/NT ! шаг изменения Х графика
! формирование данных полинома Лагранжа
do i=0,NT
x=XX(1)+i*HX ! абсцисса графика
y=lagrange(x,n,XX,YY) ! ордината графика
status = setpixel_w(x, y) ! Вывод точки графика
enddo
end subroutine curve
!******************************************************************
real function lagrange(xp,n,x,y)
real(8) xp
integer n
real(8) x(:),y(:)
integer k,i
real(8) Sum,ch,zn,omega
Sum=0 ! начальное значение суммы
do k=1,n ! проход по узлам
ch=1 ! начальное значение числителя
zn=1 ! начальное значение знаменателя
do i=1,n ! формирование омега
if(i.NE.k) then
ch=ch*(xp-x(i))
zn=zn*(x(k)-x(i))
endif
enddo
omega=ch/zn
Sum=Sum+omega*y(k) ! формирование суммы
enddo
lagrange=Sum ! передача результата
end function lagrange
!-----------------------------------------------------------
end program Lagr
Файл исходных данных.
Окно консольного приложения с результатами расчета.
Выводы:
получены навыки построения в среде Fortran интерполяционного многочлена Лагранжа для табличной функции Y(x);
овоены приемы построения графических программ;
составлена программа с использованием внутренних подпрограмм;
решена задача с использованием динамических массивов.
ИНТЕРПОЛЯЦИОННЫЙ МНОГОЧЛЕН ЛАГРАНЖА
