Название: Информатика.Алгоритмы и программы вычислительных задач микроэлектроники - Метод.(Н.В. Усольцев)

Жанр: Информатика

Просмотров: 887


4. программное обеспечение к работе

В лабораторной работе предлагается использовать готовые подпрограммы-функции RootSimpIt(), RootNewton(), RootBisecty(). Они расположены в модуле Root (файл root.cpp, файл с прототипами – root.h).

Функция RootSimpIt() реализует метод простых итераций. Ее заголовок имеет вид:

int RootSimpIt(double(*FuncName) (double X), double X0, double epsX,

int limit, int KeyDemo,

double& X, double& DX, int& Nckl);

Параметры функции имеют следующий смысл:

Входные переменные:

FuncName - имя подпрограммы-функции, реализующей правую часть уравнения;

X0       - нулевое приближение корня;

epsX   - абсолютная погрешность вычисления корня;

limit  - предельно допустимое число итераций, при достижении которого происходит выход из подпрограммы для предупреждения зацикливания;

KeyDemo - ключ демонстрации хода решения (итераций). При KeyDemo = 1 происходит непрерывный вывод данных итерации на дисплей, при KeyDemo = 2 происходит вывод данных итераций с приостановом, при KeyDemo = 0 данные итераций на дисплей не выводятся.

Выходные переменные:

X - значение корня;

DX – приращение неизвестной на последеней итерации;

Nckl – число выполненных итераций.

Возвращаемое значение функции имеет смысл кода ошибки:

RootSimpIt = Err   - код ошибки:

Err = 0 - все нормально;

Err = 1 – левая часть уравнения не вычисляется (аргумент принял недопустимое значение) и функция левой части вернула значение FLT_MAX;

Err = 2 - сходимость на limit итераций не достигнута;

Err = 3 - значение производной равно нулю и дальнейшие итерации невозможны.

Для решения конкретного уравнения пользователь функции RootSimpIt() должен написать соответствующую управляющую программу и подпрограмму-функцию, реализующую правую часть уравнения, т.е. вычисляющую по заданному значению x значение правой части уравнения. Эта подпрограмма может иметь любое имя, которое передается в RootSimpIt() через параметр FuncName в списке формальных параметров.

Функция RootNewton() реализует метод Ньютона. Ее заголовок имеет вид:

int RootNewton(double(*FuncName) (double X), double X0, double epsX,

double epsF, double dXmax, int limit, int KeyDemo,

double& X, double& Fx, int& Nckl);

Параметры функции имеют следующий смысл:

Входные переменные:

FuncName - имя подпрограммы-функции, реализующей левую часть уравнения;

X0       - нулевое приближение корня;

epsX   - абсолютная погрешность вычисления корня;

epsF   - абсолютная погрешность невязки левой части уравнения с нулем;

dXmax - максимальная величина итерационного шага, при превышении которой происходит его ограничение;

limit  - предельно допустимое число итераций, при достижении которого происходит выход из подпрограммы для предупреждения зацикливания;

KeyDemo - ключ демонстрации хода решения (итераций). При KeyDemo = 1 происходит непрерывный вывод данных итерации на дисплей, при KeyDemo = 2 происходит вывод данных итераций с приостановом, при KeyDemo = 0 данные итераций на дисплей не выводятся.

Выходные переменные:

X - значение корня;

Fx - значение левой части уравнения от корня;

Nckl – число выполненных итераций.

Возвращаемое значение функции имеет смысл кода ошибки:

RootNewton = Err   - код ошибки:

Err = 0 - все нормально;

Err = 1 – левая часть уравнения не вычисляется (аргумент принял недопустимое значение) и функция левой части вернула значение FLT_MAX;

Err = 2 - сходимость на limit итераций не достигнута;

Err = 3 - значение производной равно нулю и дальнейшие итерации невозможны.

Для решения конкретного уравнения пользователь функции RootNewton() должен написать соответствующую управляющую программу и подпрограмму-функцию, реализующую левую часть уравнения, т.е. вычисляющую по заданному значению x значение левой части уравнения. Эта подпрограмма может иметь любое имя, которое передается в RootNewton() через параметр FuncName в списке формальных параметров. Необходимое значение производной рассчитывается в RootNewton() численно.

Функция RootBisecty() реализует метод половинного деления (бисекции) в комбинации с методом хорд. Ее заголовок имеет вид:

int RootBisecty(double(*FuncName)(double x),

                              double a, double b, double epsX, double epsF,

                              int limit, int keyDemo,

                              double& x, double& Fx, int& Nckl)

Смысл ее параметров аналогичен соответствующим параметрам RootNewton() за исключением:

            a – левая граница начального интервала поиска корня;

            b - правая граница начального интервала поиска корня.

В работе также используется функция Fzero(), реализующая один из лучших мировых алгоритмов численного решения уравнений. Этот алгоритм создан сотрудниками Математического центра в Амстердаме в 60-х годах. Он описан в книге  /6/. Реализующая его функция была взята из фортрановской библиотеки Slatec и переведена нами на язык C/C++. Описание входных и выходных данных здесь не приводится, т.к. их анализ является сутью одного из следующих ниже заданий.