Реферат: записка с., 4 табл., 2 приложения, 5 источников
Название: записка с., 4 табл., 2 приложения, 5 источников Раздел: Остальные рефераты Тип: реферат | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Записка с., 4 табл., 2 приложения, 5 источников. АЛГЕБРАИЧЕСКОЕ УРАВНЕНИЕ, КОРНИ УРАВНЕНИЯ, ЧИСЛО ДЕЙСТВИТЕЛЬНЫХ КОРНЕЙ УРАВНЕНИЯ, ТЕОРЕМА ШТУРМА, МЕТОД ЛОБАЧЕВСКОГО–ГРЕФФЕ, МЕТОД ЛИНА, МЕТОД БЕРНУЛЛИ, МЕТОД БРОДЕТСКОГО–СМИЛА. В курсовом проекте рассмотрен способ приближенного нахождения корней алгебраического уравнения – метод Лобачевского–Греффе. В работе определена идея метода, его вычислительная схема, найдены условия применимости метода, условия сходимости к точному решению, дана характеристика метода с точки зрения его точности. Приведена программная реализация метода Лобачевского–Греффе для случая пары комплексно–сопряженных корней на ЭВМ. 1.2 Алгебраических уравнений 9 1.2.1 Основные понятия об алгебраическом уравнении 9 1.2.2 Оценка границ модулей корней уравнения 10 1.2.3 Корни алгебраического уравнения 11 1.2.4 Число корней полинома в некоторой области 12 1.2.5 Число действительных корней полинома 13 1.3 Метод Лобачевского–Греффе для приближенного решения алгебраических уравнений 19 1.3.3 Метод Лобачевского-Греффе для случая комплексных корней 24 1.3.4 Модификация метода Лобачевского–Греффе. Метод Бродетского–Смила 25 1.3.5 Потеря точности в методе Лобачевского–Греффе 28 1.4 Другие методы решения алгебраических уравнений с комплексными корнями 28 2.3 Описание программного продукта 38 2.4 Анализ полученных результатов 39 Вычислительная техника наших дней представляет собой мощные средства для фактического выполнения счетной работы. Благодаря этому во многих случаях стало возможным отказаться от приближенной трактовки прикладных вопросов и перейти к решению задач в точной постановке. Разумное использование современной вычислительной техники не мыслимо без умелого применения методов приближенного и численного анализа. Курс “Численные методы” занимает одно из ведущих мест среди дисциплин, которые изучают студенты специальностей ПМ, САУ, ИНФ. Численные методы направлены на решение задач, которые возникают на практике. Решение задачи численными методами сводятся к арифметическим и логическим действиям над числами, что требует применение вычислительной техники. Условия и решения задач чаще всего являются приблизительными, т.е. имеют погрешности, причиной которых являются несоответствие построенной математической модели реальному объекту, погрешность исходных данных, погрешность метода решения, погрешность округления и т.д. Целью дисциплины “Численные методы” является поиск наиболее эффективных методом решения конкретной задачи. Решение уравнений – алгебраических или трансцендентных – представляет собой одну из существенных задач прикладного анализа, потребность в которой возникает в многочисленных и самых разнообразных разделах физики, механики, техники и естествознания в широком смысле этого слова. Настоящий курсовой проект посвящен одному из методов решения алгебраических уравнений – методу Лобачевского–Греффе. Цель работы данной рассмотреть идею метода Лобачевского–Греффе для решения алгебраических, привести вычислительную схему нахождения действительных и комплексных корней, определить условия применимости метода, условия сходимости метода к точному решению, привести условную погрешность вычислений. В курсовом проекте рассмотрены основные теоретические вопросы, связанные нахождением корней алгебраических уравнений. Помимо метода Лобачевского–Греффе рассмотрены методы Лина, метод Бернулли, метод Бродетского–Смила, приведены основные принципы этих методов, указаны условия применимости. В практической части данной работы приведен комплекс программ, реализующий решение алгебраических уравнений методом Лобачевского–Греффе. Рассмотрены примеры нахождения приближенного решения уравнений данным методом. Пусть даны множество X элементов x и множество Y с элементами y. Допустим, кроме того, что на множестве X определен оператор Такая задача равносильна решению уравнения
Для него могут быть поставлены следующие проблемы. 1. Условия существования решения уравнения. 2. Условие единственности решения уравнения. 3. Алгоритм решения, следуя которому, можно было бы найти, в зависимости от поставленной цели и условий, точно или приближенно все решения уравнения (1.1), или какое-либо одно решение, заранее указанное, или любое из числа существующих. Далее будем рассматривать уравнения, в которых x и y будут численными величинами, X, Y – множествами их значений, а оператором
В теории численных методов стремятся построить вычислительный процесс, при помощи которого можно найти решение уравнения (1.2) с наперед заданной точностью. Особенно большое значение имеют сходящиеся процессы, позволяющие решить уравнение с любой, сколь угодно малой погрешностью. Наша задача – нахождение, вообще говоря, приближенное, элемента Такое описание действий, конечно, является несколько идеализированным. Обычно получают какой-либо алгоритм построения последовательности 1.2.1 Основные понятия об алгебраическом уравнении Рассмотрим алгебраическое уравнение n-й степени
где коэффициенты В общем случае будем считать, что Теорема 1.1 (основная теорема алгебры). Алгебраическое уравнение n-й степени (1.3) имеет ровно n корней, действительных и комплексных, при условии, что каждый корень считается столько раз, какова его кратность. При этом говорят, что корень
Комплексные корни уравнения (1.3) обладают свойством парной сопряженности. Теорема 1.2. Если коэффициенты алгебраического уравнения (1.3) – действительные, то комплексные корни этого уравнения попарно комплексно-сопряженные, т.е. если Следствие. Алгебраическое уравнение нечетной степени с действительными коэффициентами имеет по меньшей мере один действительный корень. 1.2.2 Оценка границ модулей корней уравнения Можно дать грубую оценку модулей корней уравнения (1.3) Теорема 1.3. Пусть
где Тогда модули всех корней
т.е. корни этого уравнения на комплексной плоскости Следствие. Пусть
т.е. корни уравнения (1.3) расположены в круговом кольце 1.2.3 Корни алгебраического уравнения Если
Произведя перемножение биномов в формуле (1.6) и приравнивая коэффициенты при одинаковых степенях x в левой и правой частях равенства (1.6), получим соотношения между корнями и коэффициентами алгебраического уравнения (1.3):
Если учитывать кратности корней, то разложение (1.6) принимает вид
где Производная где Q(x) – полином такой, что
Поэтому полином является наибольшим общим делителем полинома
и получим полином с действительными коэффициентами Таким образом, решение алгебраического уравнения с кратными корнями сводится к решению алгебраического уравнения более низкого порядка с различными корнями. 1.2.4 Число корней полинома в некоторой области Полное число корней Теорема 1.4. Если полином P(x) не имеет корней на замкнутом контуре Г, то число корней N этого полинома внутри контура Г в точности равно изменению Arg P(x) при положительном обходе контура Г, деленному на
причем каждый корень считается столько раз, какова его кратность. Если уравнение контура Г есть
1.2.5 Число действительных корней полинома Общее представление о числе действительных корней уравнения (1.3) на интервале (a,b) дает график функции Отметим некоторые свойства полинома P(x): 1. Если P(a)P(b)<0, то на интервале (a, b) имеется нечетное число корней полинома P(x) с учетом их кратностей. 2. Если P(a)P(b)>0, то на интервале (a, b) существует четное число или не существует вообще корней полинома P(x). Вопрос о числе действительных корней алгебраического уравнения на данном промежутке решается методом Штурма. Определение. Пусть дана упорядоченная конечная система действительных чисел, отличных от нуля:
Говорят, что для пары рядом стоящих элементов
и нет изменения знака, если знаки их одинаковы, т.е.
Определение. Общее число изменений знаков всех пар соседних элементов Определение. Для данного полинома P(x) системой Штурма называется система полиномов [1]
Замечание 1. Если полином Замечание 2. Элементы системы Штурма можно вычислять с точностью до положительного числового множителя. Обозначим через N(c) число перемен знаков в системе Штурма при x=c, при условии, что нулевые элементы этой системы вычеркнуты. Теорема 1.5. (теорема Штурма). Если полином P(x) не имеет кратных коней и
Следствие 1. Если
Следствие 2. Для того чтобы все корни полинома P(x) степени n, не имеющего кратных корней, были действительны, необходимо и достаточно, чтобы выполнялось условие
Таким образом в уравнении (1.3) все корни будут действительными тогда и только тогда, когда: 1) система Штурма имеет максимальное число элементов n+1, т.е. m=n; 2) выполнены неравенства С помощью системы Штурма можно отделять корни алгебраического уравнения, разбивая интервал (a,b), содержащий все действительные корни уравнения, на конечное число частичных интервалов
Так как построение системы Штурма, вообще говоря, требует громоздких вычислений, то на практике ограничиваются более простыми частными приемами подсчета числа действительных корней алгебраический уравнений. Определение. Пусть дана конечная упорядоченная система действительных чисел
С одной стороны, назовем нижним числом перемен знаков системы (1.10) число перемен знаков в преобразованной системе (1.10), где нулевые элементы
Очевидно, что если система (1.10) не имеет нулевых элементов, то число N перемен знаков в этой системе по смыслу совпадает с ее нижним
вообще же говоря, Теорема 1.6. (теорема Бюдана–Фурье). Если числа a и b (a<b) не являются корнями полинома P(x) степени n, то число N(a, b) действительных корней уравнения P(x)=0, содержащихся между а и b, равно минимальному числу
где и Предполагается, что каждый корень уравнения (1.3) считается столько раз, какова его кратность. Если производные
Следствие 1. Если Следствие 2. Если Замечание. Для подсчета числа потерянных знаков
и
Пусть
то знаки чисел
Теорема Декарта. Число положительных корней алгебраического уравнения (1.3) с учетом их кратностей равно числу перемен знаков в системе коэффициентов
Теорема Декарта представляет собой применение теоремы Бюдана–Фурье к интервалу Следствие. Если коэффициенты уравнения (1.3) отличны от нуля, то число отрицательных корней этого уравнения, с учетом их кратностей, равно числу постоянств знака в системе (1.14) его коэффициентов или меньше этого числа на четное число. (Доказательство этого утверждения следует из применения теоремы Декарта к полиному Укажем также признак вещественности всех корней полинома Теорема Гюа. Если уравнение (1.3) имеет действительные коэффициенты и все корни его действительны, то квадрат каждого не крайнего коэффициента этого уравнения больше произведения двух его соседних коэффициентов, т.е. выполнены неравенства
Следствие. Если при каком-нибудь k выполнено неравенство
то уравнение (1.3) имеет по меньшей мере одну пару комплексных корней. 1.3 Метод Лобачевского–Греффе для приближенного решения алгебраических уравнений Рассмотрим алгебраическое уравнение (1.3). Предположим, что
т.е. корни различные по модулю, причем модуль каждого предыдущего корня значительно больше модуля последующего. Другими словами, предположим, что отношение любых двух соседних корней, считая в порядке убывания их номеров, есть величина, малая по модулю:
где Далее из системы (1.7) соотношений между корнями и коэффициентами уравнения (1.3) получаем:
где
Откуда находим корни
Точность корней в системе равенств (1.20) зависит от того, насколько малы по модулю величины Чтобы добиться отделения корней, исходя из уравнения (1.3), составляют преобразованное уравнение
корнями которого Если все корни уравнения (1.3) различны и их модули удовлетворяют условию (1.17), то при достаточно большом m корни
Очевидно, что достаточно построить алгоритм нахождения уравнения, корни которого будут квадратами корней заданного уравнения. Тогда можно будет получить уравнение, корни которого будут равны корням исходного уравнения в степени Многочлен (1.3) запишем в следующем виде И умножим его на многочлен вида Тогда получим Сделав замену
Корни многочлена (1.21) связаны с корнями многочлена
Следовательно, интересующее нас уравнение есть
коэффициенты которого вычисляются по формуле (1.22)
где предполагается, что Применяя последовательно k раз процесс квадрирования корней к многочлену (1.3) , получим многочлен
в котором При достаточно больших k можно добиться чтобы для корней уравнения (1.23) выполнялась система
Определим число k, для которого система (1.24) выполняется с заданной точностью. Допустим, что нужное k уже достигнуто и равенства (1.24) выполняются с принятой точностью. Проделаем еще одно преобразование и найдем многочлен
для которого также выполнена система (1.24) при Так как в силу формулы (1.22)
то, подставив (1.25) в систему (1.24), получим, что абсолютные величины коэффициентов Таким образом квадрирование корней уравнения (1.3) следует прекратить, если в принятой точности в правой части формулы (1.24) сохраняется только квадраты коэффициентов, а удвоенная сумма произведений окажется ниже границы точности. Тогда действительные корни уравнения получаются отделенными и их модули находятся по формуле
Знак корня можно определить грубой прикидкой, подставив значения 1.3.3 Метод Лобачевского-Греффе для случая комплексных корней Рассмотрим теперь случай когда среди корней уравнения (1.3) содержаться одинаковые по модулю, тогда из предположения, что уравнение (1.3) не содержит кратных корней, следует, что если Характерным признаком этого является тот факт, что при квадрировании корней коэффициент при Согласно общей теории отделенных корней [1] корни
Откуда получаем модули корней по формуле
Относительную погрешность модуля найденного по формуле (1.27), без учета погрешности округлений при преобразованиях многочлена, можно оценить следующей величиной [2]
где Комплексные корни можно найти воспользовавшись первым и последним равенством из системы (1.7). Откуда
Тогда
1.3.4 Модификация метода Лобачевского–Греффе. Метод Бродетского–Смила Пусть Для простоты предположим, что
Разложим многочлен (1.3) по степеням
Проделаем преобразования Лобачевского–Греффе над многочленом
Пусть При выполнении операций деления и извлечения корней над числами вида
Тогда
где
Так как
Заменяя Перепишем теперь равенство (1.33) в виде Из соотношения
Эта формула дает возможность вычислить корни однократного модуля без извлечения корней степени Рассмотрим теперь, как вычислить корни двукратного модуля 1.3.5 Потеря точности в методе Лобачевского–Греффе Коэффициенты многочлена в методе Лобачевского–Греффе растут неодинаково быстро и вскоре становятся величинами разного порядка. Число преобразований многочлена обычно бывает невелико, и точность коэффициентов последнего многочлена по сравнению с точностью коэффициентов первого многочлена уменьшается за счет ошибок округления не более чем на две-три значащие цифры. Разность между корнем последнего многочлена, взятым с обратным знаком, и соответствующей степенью корня исходного многочлена не превосходит, очевидно, безусловной погрешности корня последнего многочлена, обусловленной погрешностью округления. Относительная безусловная погрешность корня довольно часто бывает величиной примерно такого же порядка, как и погрешность коэффициентов многочлена. Таким образом, относительная погрешность корня последнего многочлена лишь на несколько порядков превосходит погрешность округления. При извлечении корня степени 1.4 Другие методы решения алгебраических уравнений с комплексными корнями Иногда для нахождения корней уравнения целесообразно использовать другие методы вычислений. В ряде случаев, например при слабой сходимости метода, к найденному с меньшей точностью корню применяются методы уточнения корней. В данном разделе рассмотрены некоторые из существующих методов, которые обладают более простой чем в методе Лобачевского–Греффе вычислительной схемой. Метод Бернулли [2] позволяет найти наибольший и наименьший по модулю корень алгебраического уравнения, но и несколько ближайших к нему (по модулю) корней. Вычисления по методу Бернулли сводятся в основном к построению некоторой последовательности чисел
Далее по виду последовательности определяется вид наибольшего (наименьшего) по модулю корня и значение этого корня. Далее после того, как наибольший корень вычислен с достаточной степенью точности, определяется второй по величине модуля корень. Для второго корня строиться новая последовательность После того как найден второй по модулю корень, аналогично находятся третий и последующие корни. Пусть погрешность округления во всех вычислениях постоянна и равна
Потеря точности для последующих корней может быть значительно больше. Таким образом, метод Бернулли обладает очень простой вычислительной схемой. Основные вычисления сводятся к повторению операции накопления, что делает метод удобным для вычисления на ЭВМ. Но с другой стороны для реализации метода необходим более сложный, чем для метода Лобачевского–Греффе, логический аппарат, определяющий тип сходимости последовательности Метод Лина [2] служит для нахождения делителей любой степени для заданного многочлена. Чаще всего этот метод используется для нахождения квадратичных делителей, определяющих пару комплексных сопряженных корней многочлена. Этот метод также можно применить для вычисления наибольшего по модулю корня. Метод Лина может не привести к нахождению делителя, либо привести к нахождению не того делителя, который предполагалось вычислить. Рассмотрим многочлен (1.3) и найдем его делитель k-й степени
Для этого возьмем какой-нибудь приведенный многочлен где Вычислительная схема метода Лина достаточно проста, но вычисление корней может потребовать довольно большой вычислительной работы, а иногда может даже не привести к результату. При использовании метода Лина для вычисления комплексных корней целесообразно применять метод ускорения сходимости Хеда [2]. 2 ПРАКТИЧЕСКАЯ ЧАСТЬ Методом Лобачевского–Греффе решить уравнение:
Сначала установим количество действительных и комплексных корней в уравнении (2.1). Для этого воспользуемся теоремой Штурма. Система Штурма для уравнения (2.1) будет иметь следующий вид: Откуда получаем Таблица 2.1.
Таким образом, получаем, что число действительных корней в уравнении (2.1) равно
т.е. уравнение (2.1) содержит 2 действительных и два комплексных корня. Для нахождения корней уравнения воспользуемся методом Лобачевского–Греффе для пары комплексно–сопряженных корней. Произведем квадрирование корней уравнения. Вычисления коэффициентов производились по следующей формуле
где
а Результаты вычислений с восьмью значащими цифрами приведены в таблице 2.2 Таблица 2.2.
Как видно из таблицы 2.2 на 7-м шаге корни Так как преобразованный коэффициент при
Относительная погрешность корней, вычисленная по формуле (1.28) равна
Методом Лобачевского–Греффе решить уравнение:
Для начала с помощью теоремы Штурма определим количество действительных и комплексных корней в уравнении (2.2). Для данного уравнения система Штурма имеет вид Откуда получаем Таблица 2.3.
Таким образом, получаем, что число действительных корней в уравнении (2.2) равно
т.е. уравнение (2.2) содержит 2 действительных и два комплексных корня. Для приближенного нахождения корней уравнения воспользуемся методом Лобачевского–Греффе для пары комплексно–сопряженных корней. Произведем квадрирование корней уравнения. Вычисления коэффициентов произведем по формулам (2.2) и (2.3) . Результаты вычислений с восьмью значащими цифрами приведены в таблице 2.4 Таблица 2.4.
Как видно из таблицы 2.4 на 7-м шаге корни Так как преобразованный коэффициент при
Относительная погрешность корней, вычисленная по формуле (1.28) равна
2.3 Описание программного продукта Программный продукт, разработанный в курсовом проекте, включает в себя две независимые программы Sturm и MLG, выполненные на алгоритмическом языке Fortran и среде разработки Compaq Visual Fortran. 2.3.1 Программа Strum Программа Strum предназначена для построения системы Штурма для заданного полинома 4-го порядка. Входные данные: коэффициенты исходного полинома Выходные данные: коэффициенты многочленов Ограничения использования: многочлен Область применения: решение задач связанных с определением числа действительных корней многочлена, принадлежащих некоторому интервалу (a,b). Листинг программы представлен в Приложении А. 2.3.2 Программа MLG Программа MLG предназначена для приближенного нахождения корней уравнения 4-го порядка методом Лобачевского–Греффе. Входные данные: коэффициенты многочлена, корни которого необходимо найти. Выходные данные: коэффициенты всех вспомогательных полиномов, полученных в ходе квадрирования исходного многочлена, корни уравнения полученные с заданной точностью, оценка относительной условной погрешности найденных корней. Ограничение использования: количество комплексно–сопряженных корней должно быть не менее двух. При слабой начальной отделенности корней, рекомендуется использовать другие методы решения. Область применения: задачи связанные с нахождением всех корней заданного многочлена 4-го порядка. С незначительными изменениями программу можно использовать для решения уравнений методом Лобачевского–Греффе любого порядка. Листинг программы приводится в Приложении В к данному курсовому проекту. 2.4 Анализ полученных результатов Из полученных при решении уравнений (2.1) и (2.4) уравнений можно судить о следующих особенностях метода Лобачевского–Греффе. С помощью рассматриваемого метода можно найти все корни многочлена с достаточно высокой точностью, при не большом количестве итераций. Величина погрешности полученных корней в высокой степени зависит от отделенности корней в исходном многочлене, так, например, в уравнении (2.1) минимальная разность между различными по модулю корнями равна Таким образом, метод Лобачевского–Греффе дает хорошую точность при отделенных корнях, и значительно теряет при кратных или близких по модулю корнях. Метод Лобачевского–Греффе, который был рассмотрен в данном курсовом проекте, имеет простую схему вычислений и позволяет с помощью небольших по объему вычислений найти с большой точностью модулю всех корней алгебраического уравнения, исключая разве только кратные или очень близкие по модулю корни. Однако окончательное нахождение корней требует значительной вычислительной работы, особенно в случае комплексных корней. Затруднительным для метода является нахождение кратных корней. Однако метод можно применять и в этом случае, если предварительно избавиться от кратных корней с помощью алгоритма, описанного в данной работе. Наибольшую проблему представляют корни близкие по модулю, т. к. в этом случае происходит большая потеря точности вычислений, что влечет за собой необходимость в увеличении затрат ресурсов. В данном случае рекомендуется пользоваться другими методами нахождения корней алгебраического уравнения. Метод Лобачевского–Греффе один из самых эффективных методов вычислений, который при небольшом количестве итераций дает результат с довольно хорошей точностью, поэтому сфера использования этого метода на практике очень широкая. Методом можно пользоваться при построении математических моделей химических и физических процессов, в методах оптимизации. 1. В.П. Демидович, И.А. Марон. Основы вычислительной математики.– М.: Наука, 1966.–664с. 2. В.Л. Загускин. Справочник по численным методам решения алгебраических и трансцендентных уравнений.– М.: Государственное издательство физико-математической литературы, 1960.–216с. 3. В.И. Крылов, В.В. Бобков, П.И. Монастырский. Вычислительные методы высшей математики.–Минск: Вышэйшая школа, 1972, т. 1.–584с. 4. А.Г. Курош. Курс высшей алгебры.–М.: Наука,1971,–432с. 5. Ю.И. Рыжиков. Программирование на Фортране PowerStation для инженеров. Практическое руководство.–СПб.: КОРОНА принт, 1999.–160с. Листинг программы Sturm. Применяется для построения системы Штурма. ! Sturm.f90 ! !************************************************************************ ! ! PROGRAM: Sturm ! ! PURPOSE: Построение системы Штурма. ! !************************************************************************ program Sturm implicit none double precision, dimension(1:5,0:4) ::a double precision, dimension(0:4) ::c double precision, dimension(0:4,0:4) ::maxmas integer i,j,l double precision a1 print *,'vvedite koeffitsienty mnogochlena', ' ' read *, c !чтение данных a(1,0:4) = c !вычисление производной do i=0,3 a(2,i)=a(1,i)*(4-i) end do a1 = abs(a(2,0)) do i=0,3 a(2,i) = a(2,i)/a1 end do print '(en13.3)',a(2,0:3) ! вычисление первого частного a(3,0:4) = a(1,0:4) do i=0,1 a1 = a(3,i)/a(2,0) do j=0,3 a(3,j+i) = a(3,j+i)-a1*a(2,j) end do end do a(3,0:2) = a(3,2:4) a(3,3:4) = 0 a1 = abs(a(3,0)) do i=0,2 a(3,i) = a(3,i)/a1 end do a(4,0:4) = a(2,0:4) print *,' ' print '(en13.3)',a(3,0:2) ! вычисление второго частного do i=0,1 a1 = a(4,i)/a(3,0) do j=0,3 a(4,j+i) = a(4,j+i)-a1*a(3,j) end do end do a(4,0:2) = a(4,2:4) a(4,3:4) = 0 a1 = abs(a(4,0)) do i=0,2 a(4,i) = a(4,i)/a1 end do a(5,0:4) = a(3,0:4) print *,' ' print '(en13.3)',a(4,0:1) ! вычисление третьего частного do i=0,1 a1 = a(5,i)/a(4,0) do j=0,3 a(5,j+i) = a(5,j+i)-a1*a(4,j) end do end do a(5,0:2) = a(5,2:4) a(5,3:4) = 0 print *,' ' print '(en13.3)',a(5,0) end program Sturm Программа MLG. Решение алгебраического уравнения. ! MLG.f90 ! !*********************************************************************** ! ! PROGRAM: MLG ! ! PURPOSE: Решение алгебраического уравнения методом Лобачевского-Греффе ! !*********************************************************************** program MLG implicit none double precision, dimension(0:4) ::a1,b2,eps,summa double precision, dimension(0:8) ::b1 double precision, dimension(1:4) ::y,lg,dx double precision, dimension(1:3) ::b3 double precision koef,v,sumcmplx,prcmplx,e1,e2, epsilon double complex deskr double complex, dimension(1:4) ::x logical, dimension(0:4) ::mask logical, dimension(1:4) ::flags logical flag integer i,k,m ! задание начальных значений epsilon = 1e-3 print *,'vvedite koeffitsienty mnogochlena', ' ' read *, a1 !чтение данных !открытие файла для записи данных open (3, file='res2.txt', status='replace') write (3,10) a1 10 format (t3,'коэффициенты исходного многочлена',5(2x,es15.7)) write (3,11) epsilon 11 format (t3,'ограничение точности ',es15.7) y = 0.0 mask = .true. b1 = 0.0 b1(0:4) = a1 flag = .true. k=0 !операция квадрирования корней do while (flag) k = k + 1 !считаем номер итерации write (3,1) k 1 format (t60,'итерация № ',t75,i2) b2 = b1(0:4)*b1(0:4) summa = (/(2*s(i),i=0,4)/) write (3,2) summa 2 format (t3,'удвоенная сумма',5(2x,es15.7)) print *,' ' b2 = (/(b2(i)+2*s(i),i=0,4)/) !вычисление коэффициентов write (3,3) b2 3 format (t3,'коэффициенты ',5(2x,es15.7)) mask = mask .and. (b2 > 0) !определение действительных корней eps = 0.0 where (mask) eps = abs(b2/(b1(0:4)*b1(0:4))-1) flag = maxval(eps)>epsilon !ограничение точности if (.not. flag) then k = k-1 do i=1,4 if (.not. mask(i)) then e1 = abs(b2(i-1) - b1(i-1)*b1(i-1)) e2 = abs(b2(i+1) - b1(i+1)*b1(i+1)) koef = 1/exp((k+1)*LOG(2.0)) dx(i) = koef*(e1/(b1(i-1)*b1(i-1))+e2/(b1(i+1)*b1(i+1))) else e1 = abs(b2(i-1) - b1(i-1)*b1(i-1)) e2 = abs(b2(i) - b1(i)*b1(i)) koef = 1/exp((k+1)*LOG(2.0)) dx(i) = koef*(e1/(b1(i-1)*b1(i-1))+e2/(b1(i)*b1(i))) end if end do else b1(0:4) = b2 !запоминаем значение коэффициентов на текущей итерации end if write (3,4) 4 format (t3,' ') end do !определение номеров комплексных корней do i=1,4 if (.not. mask(i)) m=i end do mask(m+1) = .false. dx(m+1) = dx(m) !вычисление корней в уравнении Q(y) = 0 do i=1,4 if (mask(i)) y(i) = b1(i)/b1(i-1) end do !вычисление действительных корней koef = 1/exp(k*LOG(2.0)) where (mask(1:4)) lg = exp(koef*log(y)) !определение знака действительных корней flags = .false. do i=1,4 if (mask(i)) then v = polinom(lg(i))/polinom(-1.0*lg(i)) flags(i) = (v > 1.0) end if end do where (flags) lg = -1.0*lg x = lg !составляем уравнение для нахождения комплексных корней sumcmplx = -a1(1)/a1(0) do i=1,4 if (mask(i)) then sumcmplx = sumcmplx - x(i) end if end do v = -1.0 prcmplx = extent_int(v,4)*a1(4)/a1(0) do i=1,4 if (mask(i)) then prcmplx = prcmplx/x(i) end if end do b3(1) = 1.0 b3(2) = -1.0*sumcmplx b3(3) = prcmplx !нахождение комплексных корней v = b3(2)*b3(2)-4*b3(1)*b3(3) deskr = dcmplx(-1.0*b3(2),sqrt(abs(v)))/(2*b3(1)) x(m) = deskr x(m+1) = CONJG(x(m)) !вывод результата write (3,5) 5 format (t3,'-------------------------------------') write (3,6) 6 format (t3,'полученый результат') do i=1,4 write (3,7) x(i) 7 format (t20,2(es15.8,3x)) write (3,8) 8 format (t3,'') end do write (3,9) dx 9 format (t3,'относительная погрешность корней ',4(es15.8,2x)) print *,'vse vychisleniya vypolneny uspeshno', ' ', 'rezultat sohranen v faile res2.txt' close (3, status='keep') contains real(8) function s(a) integer a,j real(8) sum sum = 0.0 do j=1,a if (mod(j,2) == 0) then sum = sum + b1(a-j)*b1(a+j) else sum = sum - b1(a-j)*b1(a+j) end if end do s=sum end function s real(8) function polinom(xp) real(8) xp,p,xs integer j,l p = 0.0 do j=0,4 p = p+ extent_int(xp,j)*a1(4-j) end do polinom = p end function polinom real(8) function extent_int(num,ext) real(8) num integer ext,l real(8) w w=1.0 do l=1,ext w = w*num end do extent_int = w end function extent_int end program MLG |