Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР-12. Интерполяционный многочлен Лагранжа (FOR...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
561 Кб
Скачать
☆

Лабораторная работа № 12 интерполяционный многочлен лагранжа

Выполнил

ст. 211 гр.

Иванов А.П.

Проверил

доцент каф. 304

Скоб Ю.А.

Цель работы – освоить навыки построения в среде Fortran интерполяционного многочлена Лагранжа для табличной функции Y(x); научиться строить графические программы.

Постановка задачи

  1. Для заданной табличной функции y(X) (результаты эксперимента) построить интерполяционный многочлен Лагранжа .

  2. Проверить правильность многочлена Лагранжа , нанеся на график табличную и полиномиальную функции.

  3. Исходные данные ввести из текстового файла.

Выполнить поставленную задачу в среде программирования Fortran.Вариант № 1

Вариант № 1

Пусть по результатам мониторинга физического процесса в точках X были получены значения измеряемого параметра Y:

X

3.2

3.7

4.3

4.9

Y

1.1632

1.3083

1.4586

1.3592

Содержание работы

  1. Текст программы:

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

  1. Файл исходных данных.

  1. Окно консольного приложения с результатами расчета.

  1. Выводы:

  • получены навыки построения в среде Fortran интерполяционного многочлена Лагранжа для табличной функции Y(x);

  • овоены приемы построения графических программ;

  • составлена программа с использованием внутренних подпрограмм;

  • решена задача с использованием динамических массивов.

ИНТЕРПОЛЯЦИОННЫЙ МНОГОЧЛЕН ЛАГРАНЖА