
- •Лабораторная работа № 12 интерполяционный многочлен лагранжа
- •Постановка задачи:
- •Теоретические сведения
- •Типовой вариант
- •Порядок выполнения типового варианта
- •Лабораторная работа № 12 интерполяционный многочлен лагранжа
- •Постановка задачи
- •Для заданной табличной функции y(X) (результаты эксперимента) построить интерполяционный многочлен Лагранжа .
- •Проверить правильность многочлена Лагранжа , нанеся на график табличную и полиномиальную функции.
- •Исходные данные ввести из текстового файла.
- •Содержание работы
- •(Контрольные вопросы – правильные варианты)
(Контрольные вопросы – правильные варианты)
КАТЕГОРИЯ 1. Графические подпрограммы.
Подключение модуля стандартных процедур
use msflib
Объявление структуры параметров окна
type(windowconfig) wc
Автоматическая настройка конфигурации окна. Чтобы установить наибольшую возможную разрешающую способность, надо присвоить значение -1 параметрам структуры окна wc. После этого графическая программа стартует в режиме полноэкранного окна.
numxpixels - число пикселей по оси х,
numypixels - число пикселей по оси у,
numtextcols – число доступных текстовых колонок,
numtextrows - число доступных текстовых строк,
numcolors – число доступных цветов,
fontsize – размер шрифта по умолчанию.
data wc.numxpixels, wc.numypixels, wc.numtextcols, &
wc.numtextrows, wc.numcolors, wc.fontsize / 6*-1 /
Инициализация окна строкой в стиле С.
wc.title = "Интерполяционный многочлен Лагранжа"C
Читаем параметры видеоокна. getwindowconfig возвращает информацию об активном окне в структуру wc. Если свойства окна не были установлены с помощью SETWINDOWCONFIG, функция GETWINDOWCONFIG возвращает параметры окна по умолчанию. Логический результат res равен true, если функция выполнена успешно, false – в противном случае.
res = getwindowconfig(wc)
Графическая функция рисует прямоугольник текущим цветом и стилем. RECTANGLE использует коодинаты видеопорта, RECTANGLE_W использует систему координат окна.
result = RECTANGLE (control, x1, y1, x2, y2)
result = RECTANGLE_W (control, wx1, wy1, wx2, wy2)
control - флаг заполнения прямоугольника целого типа. Одна из символических констант заполнения:
$GFILLINTERIOR – рисует сплошную фигуру текущим цветом и заполнением.
$GBORDER – рисует фигуру без заполнения.
x1, y1 - координаты верхнего-левого угла прямоугольника типа (Input) INTEGER(2) в системе координат видеопорта.
x2, y2 - координаты нижнего-правого угла прямоугольника типа (Input) INTEGER(2) в системе координат видеопорта.
wx1, wy1 - координаты верхнего-левого угла прямоугольника типа (Input) REAL(8) в системе координат окна. wx2, wy2 - координаты нижнего-правого угла прямоугольника типа (Input) REAL(8) в системе координат окна.
result – результат целого типа INTEGER(2) возвращает ненулевое число в случае успешного завершения функции, 0 – иначе.
Графическая функция. Устанавливает текущий цвет рисования.
result = SETCOLOR (color)
color - индекс цвета рисования типа (Input) INTEGER(2);
result - результат типа INTEGER(2) имеет значение индекса предыдущего цвета; иначе -1.
Графическая процедура переустанавливает графический видеопорт, определяя область клипа. Любая установка окна рисования с помощью функции SETWINDOW выполняется относительно видеопорта, а не всего экрана.
CALL SETVIEWPORT (x1, y1, x2, y2)
x1, y1 - (Input) INTEGER(2). Физические координаты верхнего-левого угла видеопорта (прямоугольной области клипа);
x2, y2 - (Input) INTEGER(2). Физические координаты нижнего-правого угла видеопорта.
Графическая функция SETWINDOW определяет систему координат, которую используют все рисующие графические подпрограммы, имена которых заканчивается на _W (например, ARC_W, RECTANGLE_W или LINETO_W). Любая установка окна рисования с помощью функции SETWINDOW выполняется относительно видеопорта, а не всего экрана.
result = SETWINDOW (finvert, wx1, wy1, wx2, wy2)
finvert - (Input) LOGICAL(2). Определяет направление оси y. Если finvert равен .TRUE., ось y направлена от низа окна к верху. Если finvert равен .FALSE., ось y направлена от верха окна к низу (как и координаты пиксела);
wx1, wy1 - (Input) REAL(8). Координаты верхнего-левого угла окна;
wx2, wy2 - (Input) REAL(8). Координаты нижнего-правого угла окна;
result - INTEGER(2). Результат имеет ненулевое значение, если функция завершена успешно; иначе, 0 (например, если программа вызывает SETWINDOW, но находится не в графическом режиме).
Производный тип (структура) xycoord. содержит координаты (x,y) видеопорта и определена как:
TYPE xycoord
INTEGER(2) xcoord ! x-coordinate
INTEGER(2) ycoord ! y-coordinate
END TYPE xycoord
Объявление переменной xyпроизводного типа (структуры) xycoord. которая содержит координаты (x,y) видеопорта
type(xycoord) xy
Производный тип (структура) wxycoord. содержит координаты (x,y) окна и определена как:
TYPE wxycoord
REAL(8) wx ! x window coordinate
REAL(8) wy ! y window coordinate
END TYPE wxycoord
Графическая функция MOVETO перемещает текущую графическую позицию в заданную точку видеопорта с координатами (x, y). Графическая функция MOVETO_W перемещает текущую графическую позицию в заданную точку окна с координатами (wx, wy). При этом рисования не происходит. Функции MOVETO и MOVETO_W присваивает координаты предыдущей позиции переменным t и wt, соответственно.
CALL MOVETO (x, y, t)
CALL MOVETO_W (wx, wy, wt)
x, y - (Input) INTEGER(2). Координаты новой графической позиции в системе координат видеопорта;
t - (Output) производный тип xycoord. Координаты предыдущей графической позиции в системе координат видеопорта;
wx, wy - (Input) REAL(8). Координаты новой графической позиции в системе координат окна;
wt - (Output) производный тип wxycoord. Координаты предыдущей графической позиции в системе координат окна.
Графическая функция рисует линию из текущей графической позиции в заданную конечную точку включительно. Линия рисуется текущим цветом (устанавливается с помощью SETCOLORRGB), в логическом режиме вывода (устанавливается SETWRITEMODE) и стилем (устанавливается SETLINESTYLE). Если не возникает ошибок, LINETO устанавливает текущую графическую позицию в точку видеопорта (x, y), а LINETO_W устанавливает текущую графическую позицию в точку окна (wx, wy).
result = LINETO (x, y)
result = LINETO_W (wx, wy)
x, y - (Input) INTEGER(2). Конечная точка видеопорта;
wx, wy - (Input) REAL(8). Конечная точка окна;
result - INTEGER(2). Результат имеет ненулевое значение, если успешно завершена функция, иначе 0.
Графическая функция SETPIXEL устанавливает заданный пиксел в текущий цвет, который устанавливается SETCOLOR и может быть получен с помощью GETCOLOR. Не RGB цветовые функции (такие как SETCOLOR and SETPIXELS) используют индексы цвета вместо реальных значений цвета.
result = SETPIXEL (x, y)
result = SETPIXEL_W (wx, wy)
x, y - (Input) INTEGER(2). Координаты заданного пиксела в системе координат видеопорта;
wx, wy - (Input) REAL(8). Координаты заданного пиксела в системе координат окна;
result - INTEGER(2). Результатом является предыдущий цвет заданного пиксела, если функция успешна; в противном случае, -1 (например, если пиксел находится вне области рисования).
КАТЕГОРИЯ 2. Реализация функции lagrange для расчета значения полинома Лагранжа P(xp) в заданной точке по оси xp на базе массивов x(n),y(n) из координат n узлов интерполяции.
Интерполяционный
многочлен
записан в виде
.
Вспомогательный многочлен имеет вид
.
real function lagrange(xp,n,x,y)
real(8) xp ! значение аргумента в которой ищется функция
integer n ! количество точек табличной функции
real(8) x(:),y(:) ! массивы координат табличной функции
integer k ! номер текущего узла интерполяции
integer i ! индекс остальных узлов интерполяции
real(8) Sum ! текущая сумма полинома
real(8) ch,zn ! числитель, знаменатель вспом. многочлена
real(8) 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
КАТЕГОРИЯ 3. Реализация считывания из текстового файла динамических массивов координат узлов интерполяции.
Файл исходных данных.
integer,parameter::fi=1 ! устройство ввода
integer i ! счетчик точек полинома
integer n ! количество узлов интерполяции
real(8),allocatable:: X(:),Y(:) ! массивы узлов интерполяции
!-----------------------------------------------------------
open(unit=fi,file='Lab12_V1.txt') ! открытие файла данных
read(fi,*) n ! чтение количества узлов интерполяции
allocate(X(n),Y(n)) ! выделение динамической памяти X и Y
do i=1,n ! проход по узлам интерполяции
read(fi,*) X(i),Y(i) ! чтение координат i-го узла
enddo
close(fi) ! закрытие файла