|
|
|
И в библиотеке бывают рекламные паузы. |
Вначале ищем детерминант уравнения по формуле D=b2-4ac,а затем, если дискреминант больше либо равен нуля определяем корни по формуле:
При этом переменная HasRoot принимает значение True.
Если D меньше нуля, то уравнение не имеет действительных решений и переменная HasRoot принимает значение False.
Наверх
Поиск корней кубического уравнения вида: x3+ax2+bx+c=0.
Процедура находит все корни кубического уравнения. Известно, что возможно два варианта: три действительных корня, либо один действительный корень и два комплексно сопряженных. В первом случае корни уравнения помещаются в массив x, во втором случае на выходе из процедуры в переменной x[1] содержится действительный корень, а в переменных x[2] и x[3] соответственно действительная и мнимая части комплексно сопряженных корней. Колличество действительных корней содержится в переменной nr.
Для решения уравнения вначале делаем подстановку y=x-a/3 в результате которой исходное уравнение преобразуется к виду:
y3+py+q=0, где p=-a2/3+b, q=2(a/3)3-ab/3+cдалее вычисляем:
Q=(p/3)3+(q/2)2В случае, если Q - отрицательно (откуда очевидно p - отрицательно), уравнение имеет три действительных корня, которые получаются по формулам:
если Q=0 - уравнение имеет три действительных корня, которые получаются по формулам:
если Q - положительно то корни уравнения получаются по формулам:
Наверх
Процедура находит все корни уравнения четвертой степени. Известно, что возможно три варианта: четыре действительных корня, два действительных корня и два комплексно сопряженных или четыре комплексных попарно сопряженных корня. В первом случае корни уравнения помещаются в массив x, во втором случае на выходе из процедуры в переменных x[1] и x[2] содержатся действительные корни, а в переменных x[3] и x[4] соответственно действительная и мнимая части комплексно сопряженных корней, в третьем случае в переменных x[1] и x[2] содержиться соответственно действительная и мнимая части одной пары комплексно сопряженных корней, а в переменных x[3] и x[4] - другой. Колличество действительных корней находиться в переменной nr.
При решении уравнения используется метод Феррари, вначале находится действительный корень y1 кубического уравнения:
y3-by2+(ac-4d)y-a2d+4bd-c2при этом в случае когда три действительных корня берется максимальный. Для решения кубического уравнения используется предыдущий алгоритм.
Затем корни исходного уравнения находяться как корни двух квадратных уравнений:
при этом следует отметить, что подкоренное выражение в правой части является полным квадратом. Наверх
Функция находит корень уравнения x=F(x) методом простой итерации с относительной погрешностью e. По i-му приближению корня xi находится следующие приближение по формуле
xi+1=F(xi), i=0,1,2,...
Процесс продолжается до тех пор, пока относительная точность для двух последовательных приближений не станет меньше e:
|(xi+1-xi)/xi| < eПроцесс итерации сходится на [a,b], если
|F'(x)| < 1при всех x на (a,b).
Чтобы избежать зацикливания функция прекращает работу после n итераций. Переменная HasRoot=True если необходимая точность e достигнута менее чем за n итераций, и HasRoot=False, если необходимая точность за n итераций недостигнута.
Наверх
Корень уравнения x=F(x) - модифицированный метод итераций.
Процедура находит корень уравнения модифицированным методом итерации. Условие сходимости в этом методе отличается от условия в методе простой итерации. Процесс сходится к значению x' при условии, что в некоторый момент
|F(x)-x'| |F''(x')| < 2|F'(x')-1|
Следующее приближение определяется по формулам:
x0=a; xi+1=xi+di; d0=F(x0)-x0; di=di-1/(hi-1); hi=(F(xi-1)-xi-1)/(F(xi)-xi).
Чтобы избежать зацикливания функция прекращает работу после n итераций. Переменная HasRoot=True если необходимая точность e достигнута менее чем за n итераций, параметр m показывает, сколько раз поправка превосходила предыдущую. Если разность F(xi)-xi имела одно и тоже значение дважды подряд, то HasRoot=False. Так же HasRoot=False, если необходимая точность за n итераций недостигнута.
Наверх
Корень уравнения метод половинного деления.
Процедура находит корень уравнения F(x)=0, где F(x) - непрерывная на отрезке [a,b] функция, удовлетворяющая условию
F(a)F(b) < 0
Для нахождения корня отрезок [a,b] делится пополам и выбирается тот полуинтервал на концах которого знаки F(x) разные. Затем процесс деления повторяется до тех пор, пока длина интервала не станет меньше e.
Если начальное условие F(a)F(b) < 0 не выполнено, то процедура прекращает работу и переменной HasRoot присваивается значение False. Если корень найден, то HasRoot=True, и корень находится в переменной x.
Наверх
Решение уравнения методом Ньютона (метод касательных).
Действительный корень x' уравнения F(x)=0 вычисляется методом Ньютона по итерационному уравнению:
xk+1=xk-F(xk)/F'(xk)
Процесс сходится к точному значению корня, если начальное приближение x1 выбрано так, что
|F(x1)F''(x1)| < |F'(x1)|2
Оценка погрешности k-го приближения производится по приближенной формуле
|F(xk)F'(xk)| < e
В процедуре кроме функции F используется также функция DF- производная функции F.
Наверх
Нахождение корней уравнения модифицированным методом Ньютона (метод хорд).
Если вычисление производной в методе Ньютона затруднено, можно заменить ее вычисление оценкой:
F'(x)= (F(x+h)-F(x))/h
Кроме ставшей уже обычной в этом разделе точности e, в процедуру так же передается параметр h из предыдущей оценочной формулы для производной.
Наверх
Решение уравнения методом секущих-хорд.
Если на интервале [a,b] непрерывная функция F(x) удовлетворяет условию F(a)F(b) меньше нуля, то корень уравнения F(x)=0 может быть найден методом секущих:
xn=xn-1-F(xn-1)(xn-1-xn-2)/(F(xn-1)-F(xn-2)).
Погрешность значения корня оценивается по формуле
|xn-xn-1| < eдля этого в процедуру передается переменная е.
Если на некотором этапе работы процедуры F(xn)F(xn-1) становится больше 0, то дальнейшие приближения ничего не дадут и процедура завершает поиск корня и выставляет переменную HasRoot=False. Если же HasRoot=True, значит корень найден с заданным приблежением и находится в переменной x.
Наверх
Решение системы уравнений.
Решение системы трансцендентных уравнений
x1=F1(x1,x2, . . .,xn), x2=F2(x1,x2, . . .,xn), . . . . xn=Fn(x1,x2, . . .,xn)Производится по итерационным формулам модифицированного метода Зейделя:
x1(k+1)=F1(x1(k),x2(k), . . .,xn(k)), x2(k+1)=F2(x1(k+1),x2(k), . . .,xn(k)), . . . . xn(k+1)=Fn(x1(k+1),x2(k+1), . . .,xn-1(k+1),xn(k)).Оценка точности имеет вид:
max|xi(k+1)-xi(k)| < e, i=1..n.Итерационный процесс сходится при условии
В процедуре используются функции F(i,x[1..N]), где i соответствует номеру функции в исходной системе, а вектор x аргумент функции в системе.
Наверх
Разложение полинома на рациональные линейные множители.
Процедура находит все рациональные линейные множители (Uix+Vi) многочлена
p(x)=a0xn+a1xn-1+...+an=(U1x+V1)...(Urx+Vr)(d0xn-r+...+dn-r),где коэффициенты ak - целые, а полином с коэфициентами dk линейных рациональных множетелей не содержит.
В процедуре находятся все делители p и q чисел a0 и an соответственно. Затем при условии, что px-q является множителем многочлена, p(x) делится по алгоритму Евклида на px-q. Получается новый полином, для которого повторяется вся процедура до тех пор, пока не будет получен полином, не имеющий рациональных линейных множителей.
Коэфициенты исходного полинома передаются в процедуру используя массив A, в этот массив на выходе из процедуры помещаются коэфициенты полинома не содержащего линейных рациональных множителей di. Наверх
|