Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции АиП.doc
Скачиваний:
97
Добавлен:
15.11.2018
Размер:
668.67 Кб
Скачать

Void exch(double &a, double &b)

{ a=a+b; b=a-b; a=a-b; }

Эта программа использует меньше памяти, однако требуется комментарий, чтобы объяснить, для чего она предназначена.

Лекция № 7. Численное решение уравнений

    1. Теоретические основы

Предположим, нам нужно решить кубическое уравнение

. (7.1)

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

. (7.2)

Такой график приведен на рис. 7.1.

Рис. 7.1. График функции

Как можно видеть, действительный корень уравнения (7.1) располагается где-то в диапазоне между 0,6 и 0,8. Если известно, что в заданном диапазоне находится только один корень уравнения, то функции от крайних точек диапазона, как правило, имеют разные знаки. Например, в случае функции, изображенной на графике рис. 7.1, имеет положительное значение, а – отрицательное значение. Можно утверждать и обратное: если значения функции на краях интервала имеют разные знаки, то внутри интервала содержится корень уравнения. Однако если функция имеет разрывы в некоторых точках, это правило не справедливо. Например, функция изменяет знак в точках , , как показано на рис. 7.2. Однако в этих точках нет корней уравнения, поскольку функция не пересекает ось . Такие точки называются сингулярными.

Рис. 7.2. График функции

    1. Метод простого перебора

Самым простым методом решения алгебраических уравнений является метод перебора в заданном интервале. Программа, которая реализует данный метод, представлена в листинге 7.1. Помимо основной функции main() она содержит также функции RootSearch()и Func(). В функции main() пользователь вводит исходные данные, после чего вызывается функция RootSearch(), которая непосредственно и вычисляет корень уравнения.

Листинг 7.1. Решение уравнения методом перебора

# include <iostream>

/* Прототипы функций */

Int RootSearch (double p[], int n, double a, double b, double dx);

double Func (double p[], int n, double x);

int n;

double p[10];

double a, b, dx; // Глобальные переменные

Int main ()

{

cout<<"Input degree of polynomial: ";

cin>>n;

cout<<endl;

cout<<"Input function:\n";

for (int i=0; i<(n+1); i++)

{

cin>>p[i];

}

cout<<endl;

cout<<"Input left limit: ";

cin>>a;

cout<<endl;

cout<<"Input right limit: ";

cin>>b;

cout<<endl;

cout<<"Input step: ";

cin>>dx;

cout<<endl;

RootSearch(p, n, a, b, dx);

return 0;

}

Int RootSearch (double p[], int n, double a, double b, double dx)

{

double x1, x2, f1, f2; //Локальные переменные

x1=a;

x2=a+dx;

f1=Func(p, n, x1);

f2=Func(p, n, x2);

while (f1*f2>0.0)

{

if (x1>=b)

{

cout<<"Root is not bracketed in ("<<a<<", "<<b<<")"<<"\n";

char Res;

cin>>Res;

return 0;

}

x1=x2;

f1=f2;

x2=x1+dx;

f2=Func(p, n, x2);

}

cout<<"x1: "<<x1<<"\n";

cout<<"x2: "<<x2<<"\n";

char Res;

cin>>Res;

return 0;

}

double Func (double p[], int n, double x)

{

double Sum=0;

double y=1;

for (int i=0; i<(n+1); i++)

{

Sum=Sum+p[i]*y;

y=y*x;

}

return Sum;

}

Функция Func() используется функцией RootSearch() как подпрограмма. Во второй и третьей строчках программы заявлены прототипы функций. Далее объявляются глобальные переменные, которые доступны для всех функций программы. В языке С++ глобальные переменные почти никогда не используются, поскольку существует возможность, что какая-либо из функций может изменить их значение. Альтернативой глобальным переменным являются статические переменные-члены, которые доступны всем экземплярам своего класса. Они представляют собой компромисс между глобальными данными, доступными всем элементам программы, и данными-членами, доступными только объектам этого класса.

В данной программе глобальные переменные используются в качестве примера. Угроза их несанкционированного изменения отсутствует.

В отличие от глобальных переменных локальные переменные объявляются внутри функций. После выполнения функцией своей задачи ее локальные переменные стираются из памяти.