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

Алгоритм Ньютона-Рафсона является наиболее известным методом отыскания корней уравнения по причине своей простоты и высокого быстродействия. Гладкую и непрерывную функцию можно разложить в ряд Тейлора

.

Если является корнем уравнения , то можем записать

.

Приравнивая остаток нулю, получим формулу Ньютона-Рафсона:

. (7.4)

Эта формула позволяет находить корень уравнения (если он существует на заданном отрезке) с заданной ошибкой за конечное число шагов. Программа, решающая заданное уравнение методом Ньютона-Рафсона, представлена в листинге 7.3.

Листинг 7.3. Решение уравнения методом Ньютона-Рафсона

#include <iostream.h>

#include <math.h>

int NewtonRaphson();

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

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

void main ()

{

NewtonRaphson();

}

int NewtonRaphson()

{

int i, n, numIter;

double p[10];

double x, dx, tol, root;

cout<<"Input degree of polynomial: ";

cin>>n;

cout<<endl;

cout<<"Input function:\n";

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

{

cin>>p[i];

}

cout<<endl;

cout<<"Input x: ";

cin>>x;

cout<<endl;

tol=0.000001;

for (i=1; i<31; i++)

{

dx=-Func(p, n, x)/dFunc(p, n, x);

x=x+dx;

if (fabs(dx)<tol)

{

root=x;

numIter=i;

cout<<"Root: "<<root<<endl;

cout<<"NumIter: "<<numIter<<endl;

char Res;

cin>>Res;

return 1;

}

}

cout<<"The root isn't found";

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;

}

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

{

double Sum=0;

double y=1;

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

{

Sum=Sum+i*p[i]*y;

y=y*x;

}

return Sum;

}

На рис. 7.3 показан график функции

. (7.5)

Как можно видеть, эта функция на интервале (0, 5) имеет два корня. Причем, первый корень совпадает с локальным экстремумом функции, при этом значения функции слева и справа от этого корня имеют один и тот же знак. Поэтому метод дихотомии не позволит определить этот корень. Однако метод Ньютона-Рафсона вполне способен справиться с данной проблемой.

Численные методы позволяют найти лишь один корень – даже в том случае, если уравнение имеет несколько действительных корней. Например, если в качестве исходных данных мы возьмем полином (7.5), и в качестве начального значения примем х=3, то получим корень х=2,1. Если же мы возьмем начальное значение х=3,9; то получим второй корень х=4.

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

Лекция № 8. Основы объектно-ориентированного программирования

    1. Введение

Язык С++ был создан как объектно-ориетированное продолжение одного из самых популярных в мире языков для разработки коммерческих программ. Язык С был разработан как нечто среднее между языками высокого уровня для бизнес-приложений (таких, как COBOL) и работающим на уровне «железа» высокоэффективным, но трудным в использовании языком ассемблер. Язык С является структурным, т.е. решение задачи разбивается на небольшие участки кода, реализующего определенные действия, которые называются процедурами.

Однако такие языки, как Smalltalk и CLU, проложили новое направление – ориентацию на объекты, что позволило объединить содержащиеся в структурах данные с процедурами, способными их обрабатывать. Такой единый блок называется объектом (object).

Мир наполнен объектами: автомобили, собаки, деревья, облака, цветы – все это объекты. Каждый объект имеет свойства (быстрый, дружелюбный, коричневый, пушистый, милый). Объекты ведут себя определенным образом (едут, лают, растут, увядают).

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

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

Типы переменных, включая беззнаковые целые и символы, были описаны на предыдущих занятиях. В традиционных языках, к которым относится С, все типы встроены в язык. В С++ программист может самостоятельно расширить возможности языка, создавая собственный тип данных, необходимый для решения текущей задачи. Каждый из вновь созданных типов обладает всеми функциональными возможностями и правами встроенных типов.

В языке С++ новый тип данных создается в результате объявления класса. Класс – это набор переменных, зачастую различных типов, объединенный с набором функций, предназначенных для работы с ними.

Автомобиль, например, можно представить как набор колес, дверей, сидений, окон и т.д. Или как удобное средство передвижения, способное ехать, разгоняться, тормозить, останавливаться, парковаться и т.д. Класс позволяет собирать различные запчасти автомобиля и его разнообразные функции в один комплект, называемый объектом.

Объектно-ориетированные языки основаны на «трех китах»: инкапсуляции, наследовании и полиморфизме.

Инкапсуляция означает свойство автономности объектов, скрытности их внутреннего механизма от посторонних глаз. С помощью инкапсуляции можно обеспечить сокрытие данных. Это очень важное свойство, благодаря которому пользователь может использовать объект, не задумываясь о его внутренней работе.

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

Полиморфизм означает, что можно вносить изменения в одноименные функции различных объектов. На греческом языке поли – это много, а морфе – это форма, таким образом дословно полиморфизм – это многообразие форм.

Инкапсуляция всего, что известно об автомобиле, в единый класс предоставляет разработчику ряд преимуществ. Когда все сведения собраны в одном объекте, к ним легче обращаться, копировать и манипулировать ими. При использовании класса можно не заботиться о том, как он устроен и какие процессы происходят внутри него.

Класс может состоять из комбинации переменных любых типов, а также других классов. Переменные в классе называют переменными-членами, или данными-членами. Класс Car (автомобиль) может иметь переменные-члены, представляющие сидения, радиоприемник, шины и т.д.

Функции в классе обычно выполняют действия над переменными-членами. Они называются функциями-членами, или методами класса. К методам класса Car можно отнести Start() (разгоняться) и Break() (тормозить). Класс Cat (кот) может иметь такие данные-члены, как Age, Weight (возраст и вес), а его методами могут быть Sleep(), Meow() и ChaseMice() (спать, мяукать и ловить мышей). Подобно переменным-членам, функции-члены являются составной частью класса. Именно они определяют, что данный класс может сделать.

Для объявления класса используется ключевой слово class, за которым следует открывающая фигурная скобка, список данных-членов и методов класса. Объявление завершается закрывающейся фигурной скобкой и точкой с запятой. Вот как выглядит объявление класса Cat:

Class Cat

{

unsigned int itsAge;

unsigned int itsWeight;