Смекни!
smekni.com

Метод Лобачевського-Греффе (стр. 2 из 2)

Звідси маємо:

(k=1, 2, …, n); (4)

знаки коренів визначаються грубою прикидкою, при підстановці в дане рівняння, або на підставі співвідношень між коренями та коефіцієнтами рівнянь. Процес квадратування коренів зазвичай продовжується доти, доки подвоєні добутки не перестануть впливати на перші головні члени коефіцієнтів перетвореного рівняння. Правило. Процес квадратування коренів варто припинити, якщо коефіцієнти деякого перетвореного рівняння в межах точності обчислень дорівнюють квадратам відповідних коефіцієнтів наступного перетвореного рівняння за рахунок відсутності подвоєних добутків. Дійсно, якщо перетворене рівняння, що відповідає ступеню 2p+1, має вигляд

та виконані співвідношення

(k=0, 1, 2, …, n),

то, вочевидь, отримаємо:

.

Таким чином, при цих обставинах ми не зможемо збільшити точність обчислення коренів. Так як при використання метода Лобачевського-Греффе коефіцієнти перетворених рівнянь, взагалі кажучи, швидко зростають, то корисно виділяти порядки їх, записуючі коефіцієнти в стандартній формі α*10m, де |α|<10 та m – ціле число.


1.6 Формули методу

Як сказано в ідеї методу

(1)

Отже, якщо корені рівняння

відділені, то вони наближено визначаються з ланцюжку рівнянь

;

причому точність цих коренів залежить від того, наскільки малі за модулем величини

k в співвідношеннях

.

При квадратуванні коренів коефіцієнти при змінних, як було сказано, дорівнюють

A0=a02,

A1=a12-2a0a2,

A2=a22-2a1a3+2a0a4,

An=an2.

Коротше можна записати:

(k=0, 1, 2, …, n),

де мається на увазі as=0 при s<0 і s>n.

Після квадратування коренів отримаємо рівняння:

,

де

;

отже

. (2)

Виходячи з системи (1)


(3)

З формул (2) та (3) отримуємо

.

2. Конкретні приклади використання методу

2.1 Приклад

Методом Лобачевского-Греффе знайти корені рівняння

.

Рішення. Результати квадратування коренів, залишаючи чотири значущі цифри розміщені в таблиці 1.

Ступені коеф. при x3 коеф. при x2 коеф. при x1 коеф. при x0
1 1 0 -3 1
2 1 6 9 1
4 1 18 69 1
8 1 1,86*102 4,725*103 1
16 1 2,515*104 2,233*107 1
32 1 5,878*108 4,986*1014 1
64 1 3,445*1017 2,486*1029 1
128 1 1,187*1035 6.180*1058 1

Зупиняючись на 64-ому ступеню коренів, матимемо:

Звідси


Логарифмуючи, отримаємо:

а, отже,

Для визначення знаків коренів зауважимо, що згідно з правилом Декарта наше рівняння має один негативний корінь та два позитивних корені, причому

Тому найбільшим за модулем має бути негативний корінь, і ми остаточно маємо:


причому співвідношення

виконано в межах заданої точності. Для порівняння можна взяти точні значення коренів, отримані за формулою Кардана:

x1=2cos160°=-1.87938;

x2=2cos40°=-1.53208;

x3=2cos80°=0.34730.

Зауважимо, що в нашому випадку обчислення коренів настільки спростилося завдяки тому, що крайні коефіцієнти рівняння дорівнюють 1. Взагалі, при використанні метода Лобачевского-Греффе радимо попередньо перетворити рівняння так, щоб старший коефіцієнт рівняння дорівнював 1, а вільний член рівняння дорівнював ±1.

Програма обчислення коренів рівняння наведена в ДодаткуA.


Висновки

В роботі ми розглянули метод Лобачевского-Греффе, навчилися використовувати його для розв’язання алгебраїчних рівнянь.

Вивчивши алгоритм методу, склали програму мовою C++, що спрощує його обчислення. Вона докладно описується в додаткуA.


Перелік посилань

1. „Основы вычислительной математики”; Б. П. Демидович, І. А. Марон; „Государственное издательство физико-математической литературы”, Москва, 1960

2. „Математический анализ”; А. Я. Дороговцев; „Либідь”, Київ, 1993

3. „Программирование на языке C++”; С. А. Калоєров; „Юго-восток”, Донецьк, 2004


Додаток A

Скласти програму для обчислення коренів алгебраїчного рівняння

Код програми, що обчислює корені алгебраїчного рівняння методом Лобачевского-Греффе.

#include<iostream.h>

#include<math.h>

void main()

{int j,s,k,i,n,step,izo;

double summ,akms,akps,b;

cout<<"Введите степень уравненийа&bsol;n";

cin>>step;

n=step+1;

double*a=new double[n];

double*A=new double[n];

double*x=new double[step];

cout<<"Введите коэффициенты при переменных&bsol;n";

for(i=0;i<=step;i++)

cin>>a[i];

for(j=2;j<=128;j*=2)

{for(k=0;k<=step;k++)

{summ=0.0;

for(s=1;s<=k;s++)

{if(((k-s)<0)||((k-s)>step)) akms=0.0; else

akms=a[k-s];

if(((k+s)<0)||((k+s)>step)) akms=0.0; else

akps=a[k+s];

summ=summ+pow(-1,s)*akms*akps;

}

A[k]=a[k]*a[k]+2*summ;

}

for(i=0;i<=step;i++)

a[i]=A[i];

}

b=1.0/128.0;

for(i=0;i<step;i++)

x[i]=pow((a[i+1]/a[i]),b);

for(i=0;i<step;i++)

{izo=i+1;

cout<<"X"<<izo<<"="<<x[i]<<"&bsol;n";

}

cout<<"Подставьте корни в исходное уравнение, меньайа знаки корней на противоположные, если они не обращают его в тождество";

}

Результат роботи програми