Автор: Пользователь скрыл имя, 24 Марта 2011 в 08:19, лабораторная работа
Цель работы: Решить системы нелинейных алгебраических уравнений.
Задание: графически и численно решить систему нелинейных алгебраических уравнений, на примере поиска точек пересечения двух функций.
Министерство образования и науки Российской Федерации
Ульяновский
государственный технический
Кафедра
«Измерительно-вычеслительные комплексы»
Отчет
По лабораторной работе №8
( Вариант
6)
Выполнил:
студент гр. ИСТд-12
Денисов Д.В.
Преподаватель:
к.т.н., доцент каф. ИВК
Степчева
З.В.
Ульяновск,
2010 г.
Задание: графически и численно решить систему нелинейных алгебраических уравнений, на примере поиска точек пересечения двух функций.
На отрезке -5<x<5;
Требования:
Программа должна после запуска на
исполнение выводить информацию об авторе,
назначении программы (распечатка на экране
набора символов), перед запросом ввода
данных с клавиатуры обязательно должно
быть сообщение о типе и количестве вводимых
данных.
Текст программы:
program lab_8;
uses
Crt,
Graph, { модуль графической библиотеки }
Consts, { модуль с константами }
Types, { модуль описания типов данных }
Mathem1,Mathem2, { модули математических преобразований }
Draw1,Draw2; { модули процедур и функций для рисования }
procedure info;
begin
clrscr;
writeln('Лабораторная работа №8');
writeln('"Решение систем нелиненых алгебраических уравнений"');
writeln('');
writeln('Выполнил студент группы ИСТд-12 Денисов Дмитрий');
writeln('');
writeln('Задание:');
writeln(' Графически и численно решить систему нелинейных ');
writeln(' алгебраических уравнений на примере поиска точек ');
writeln(' пересечения двух функций. ');
writeln(' ');
writeln('Вариант №6: ');
writeln(' / ');
writeln(' | y=(x+5)/x^2+2 ');
writeln(' < ');
writeln(' | y=x^2-2x-3 ');
writeln(' \ ');
end;
{ Первая математическая функция }
function F1(x:real):real;far; { Дальняя ссылка }
begin
F1:=(x+5)/(x*x+2);
end;
{ Вторая математическая функция }
function F2(x:real):real; far; { Дальняя ссылка }
begin
F2:=x*x-2*x-3;
end;
{ **************** Основная часть **************** }
var
M1,M2:TMatMas; { Таблицы математических функций }
Y1min,Y2min, { Минимумы и ... }
Y1max,Y2max, { ... максимумы математических функций }
Ymin,Ymax:real; { Абсолютный минимум и максимум функций }
Ms1,Ms2:TScrMas; { "Экранные" таблицы }
Xo,Yo:word; { Координаты "экранного" нуля }
Kx,Ky:real; { Масштабирующие коэффициенты }
RootMas:TRoot; { Массив точек пересечения }
K:word; { Количество точек пересечения }
Rect:Trect; { Прямоугольник для вывода графика }
begin
info;
{ ********* Подготовка данных для рисования *********** }
with Rect do
begin
Origin.X:=originx;
Origin.Y:=originy;
Size.X:=Nx;
Size.Y:=Ny;
end;
{ Заполнение таблиц математических функций }
EnterMatMas(M1,Nx,@F1,Xmin,
EnterMAtMas(M2,Nx,@F2,Xmin,
{ Вычисление минимума и максимума математических функций }
Y1min:=Min(M1,Nx); Y1max:=Max(M1,Nx);
Y2min:=Min(M1,Nx); Y2Max:=Max(M2,Nx);
Ymin:=Minimum(Y1min,Y2min);
Ymax:=Maximum(Y1max,Y2max);
{ Вычисление масштабирующих коэффициентов }
Kx:=Nx/(Xmax-Xmin);
Ky:=Ny/(Ymax-Ymin);
{ Заполнение "экранных" таблиц }
EnterScrMas(Ms1,M1,Ymin,Ky,
EnterScrMas(Ms2,M2,Ymin,Ky,
{ Вычислить координаты "экранного" нуля }
Zero(Xmin,Xmax,Ymin,Ymax,Rect,
{ Найти точки пересечения }
K:=Solution(Xmin,Xmax,@F1,@F2,
{ ********************** Рисование ********************* }
GraphInit;
{ Нарисовать рамку }
Ramka(rect,Width,Cyan);
{ Рисование граничных значений по углам рамки }
DrawBounds(Xmin,Xmax,Ymin,
{ Рисование координатной сетки }
DrawGridLines(NgrX,NgrY,Rect,
{ Нарисовать оси }
DrawAxis(Rect,Xo,Yo,Red);
{ Нарисовать функции }
DrawFunction(Ms1,Nx,
DrawFunction(Ms2,Nx,Yellow);
{ Вывести координаты точек пересечения }
WriteCoord(RootMas,K,Rect,
ReadKey;
closegraph;
end.
Модуль постоянных:
unit Consts;
interface
const
Nx=440; { Размер графика по оси X }
Ny=480; { Размер графика оси Y }
OriginX=180; OriginY=40; { Левый верхний угол рамки }
Xmin=-5; Xmax=5; { Начальное и конечное значения аргумента }
NgrX=10; NgrY=26; { Количество линий координатной сетки }
Epsilon=0.001; { Точность решения }
R=10; { Количество поддиапазонов }
const
Width=3; { Ширина рамки }
implementation
end.
Модуль используемых
типов:
unit Types;
interface
uses Consts;
type
TMatMas=array[1..Nx] of real; { Тип математической таблицы }
TScrMas=array[1..Nx] of word; { Тип "экранной" таблицы }
TRealCoord=record x,y:real; end; { Тип координата в действит. числах }
TRoot=array[1..Nx div 10] of TRealCoord; { Тип массив точек пересечения }
TIntCoord=record x,y:word; end; { Тип координата в целых числах }
TRect=record
Origin:TIntCoord;
Size:TIntCoord;
end;
implementation
end.
Модули математической
обработки исходных данных:
Первый модуль:
unit Mathem1;
interface
uses Types, Consts;
procedure EnterMatMas (
var M : array of real; { Таблица математической функции }
Nx : word; { Количество точек в таблице }
Func : Pointer; { Указатель на математическую функцию }
Xmin,Xmax : real { Начальное и конечное значения аргумента }
);
{ Вычисление точек пересечения }
function Solution(
Xmin,Xmax:real; { Минимум и максимум аргумента }
F1,F2:pointer; { Математические функции }
var RootMas:TRoot): { Массив координат пересечения }
byte; { Количество точек пересечения }
implementation
procedure EnterMatMas(
var M : array of real; { Таблица математической функции }
Nx : word; { Количество точек в таблице }
Func : Pointer; { Указатель на математическую функцию }
Xmin,Xmax : real { Начальное и конечное значения аргумента }
);
type
TFunc = function (x:real):real; { Описание типа функции }
var
F : TFunc; { Математическая функция }
x : real; { Значение аргумента }
dx : real; { Шаг вычисления функции }
i : word; { Счетчик вычисляемых точек }
begin
F:=TFunc(Func); { Сделать ссылку на математическую функцию }
dx:=(Xmax-Xmin)/(Nx-1); { Вычислить шаг вычисления функции }
x:=Xmin; { Начальное значение аргумента }
for i:=0 to Nx-1 do { Цикл заполнения таблицы }
Информация о работе Решение систем нелинейных алгебраических уравнений