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

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

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


4. решение нелинейных уравнений с комплексными корнями

В общем случае, левая часть уравнения

                      (1)

представляет собой комплексную величину,  у которой в точке корня должны обратиться в нуль действительная и мнимая части:

                               (2)

 

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

Другой подход основан на том, что аналитическую функцию можно дифференцировать по комплексному аргументу z.  Если , а , то

.                  (3)

Поэтому становится возможным организовать ньютоновские итерации по формуле:                                                          (4)

Существенным моментом для решения таких уравнений является выбор нулевого приближения. Чтобы итерации сходились, нулевое приближение должно быть достаточно близко от корня. Корней может быть несколько и в этом случае поможет геометрическая интерпретация решения с помощью Origin. Если на комплексной плоскости X-Y построить линии равного значения вещественной и мнимой частей z, равных нулю, то точки их пересечения имеют своими координатами действительные и мнимые части корней.

Во многих задачах физики и техники необходимо найти комплексные корни вещественного полинома с вещественными коэффициентами:

                                                         (5)

Они либо имеют равную нулю мнимую часть (т.е.  расположены на оси x),  либо комплексно-сопряженные (т.е.  расположены симметрично оси x).

При поиске корней рекомендуется сначала найти вещественные корни полинома, рассматривая z как чисто вещественную величину, а затем и комплексные. Нахождение каждого корня  позволяет понизить порядок полинома на единицу путем деления его на :

,                (6)

но при таком делении коэффициенты полинома становятся комплексными.

5. Программные модули, используемые в работе

В лабораторной работе для решения нелинейных уравнений предлагается использовать готовую подпрограмму-функцию RootComplex(), находящуюся в модуле root.cpp и реализующую метод Ньютона. Ее заголовок имеет вид:

  int RootComplex(complex(*FuncName)(complex Z), complex Z0,

                                                double epsZ, double epsF, double dZmax,

                                                int limit, int KeyDemo,

                                                complex& Z, complex& Fz, int& Nckl)

Ее входные и выходные параметры соответствуют параметрам RootNewton() и имеют следующий смысл:

входные переменные

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

Z0 – нулевое приближение корня;

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

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

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

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

KeyDemo – ключ демонстрации промежуточных данных (итераций);

при KeyDemo=1 происходит непрерывный  вывод  данных итераций на дисплей;

при KeyDemo=2 происходит вывод с приостановом;

при KeyDemo=0 вывода нет.

выходные переменные

Z – найденное значение корня;

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

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

Возвращаемое значение – RootComplex = Err –  код ошибки:

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

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

Левая часть уравнения  должна быть оформлена  в виде функции с заголовком:

complex FuncName(complex Z)

 

Имя функции может быть любым и передается в RootComplex() через указатель *FuncName  в списке ее формальных параметров. Рекомендуется, чтобы  FuncName()  возвращало значение FLT_MAX (константа из <float.h>), если значение аргумента вышло из области определения функции. Например,

#include <math.h>

#include <float.h>

complex f(complex z)

{

if (z<0.0) return complex(FLT_MAX,FLT_MAX);

return sqrt(z);

}

Это позволит корректно завершить итерационный процесс.

Для исключения механизма  ограничения приращений  (если это необходимо) следует значение параметра  dZmax задать достаточно большим, например, равным той же константе FLT_MAX.

В работе также используются функции модуля LinSys: LinGauss(), LinLU() и LineProgon().

 

6. Задание к работе

1. Проверить работу с комплексными величинами на языке С++. Ознакомиться с тем, как они выводятся на дисплей. Выполнить все арифметические действия и проверить работу перечисленных выше в тексте комплексных функций.

2. Представить с помощью Origin графики в виде поверхностей вещественной части, мнимой части, модуля и аргумента одной из аналитических функций комплексной переменной, перечисленных выше (по указанию преподавателя).

3. Рассчитать и построить зависимости действительных и мнимых частей, модуля и аргумента от параметра  для следующих комплексных функций:

3.1                3.2

3.3                3.4

3.5                3.6

 

4. Ввести описание типов комплексного вектора и комплексной матрицы в define.h. Разработать функции для ввода комплексных вектора и матрицы с клавиатуры; для вывода комплексных вектора и матрицы на дисплей; для умножения комплексной матрицы на комплексный вектор и комплексной матрицы на комплексную матрицу.

5. Переделать одну из функций на языке C++ для решения СЛАУ (методом Гаусса, LU-разложения или прогонки) в функцию для решения СЛАУ с комплексной матрицей коэффициентов и вектора свободных членов. Для разработки тестовых данных и проверки ее работы использовать функцию умножения матрицы на вектор из предыдущего пункта.

6. Методом Ньютона с использованием функции RootSystem() найти комплексные корни полинома, заданного преподавателем, например:

 

7. Методом Ньютона с использованием функции RootComplex() найти комплексные корни полинома, заданного преподавателем.

8. Превратить функцию для расчета определителя матрицы DetMat() в функцию, работающую с комплексными величинами. Найти собственные значения матрицы A, заданной преподавателем, путем решения характеристического уравнения   с помощью RootComplex().

Литература:  [2, 3]/

 

Лабораторная работа № 8

Аппроксимация табличных функций методом наименьших квадратов

 

1.  Введение

Аппроксимация – это определение аналитической функции, которая наилучшим образом описывает таблицу числовых значений «аргумент(ы) – функция». Данные таблицы могут быть получены  из экспериментальных исследований или расчетом (например, численным интегрированием краевой задачи с дифференциальным уравнением). Чаще всего встречаются задачи аппроксимации табличной функции одного аргумента , но нередки и задачи аппроксимации функции двух () и более аргументов.

Исходя из требований, предъявляемых к результату, задачи аппроксимации можно разделить на интерполяционные задачи и задачи оптимального приближения. В первом случае искомая функция должна точно проходить через заданные точки, а во втором – объединять их наиболее оптимальным образом. Интерполяцию чаще используют, при точных исходных данных (полученных расчетом), а оптимальное приближение – если данные получены из эксперимента и имеют случайный разброс. Оптимальное приближение позволяет сгладить этот разброс и приблизиться к реальной гладкой зависимости.

В лабораторной работе изучается оптимальное приближение функции методом наименьших квадратов. Осваивается практическая работа с программами, предназначенными для решения этой задачи.