Нахождение рациональных корней многочлена с рациональными коэффициентами
Многочлены или полиномы от одной переменной. Изучение полиномиальных уравнений и их решений. Введение в рассмотрение нуля, отрицательных и комплексных чисел. Развитие методов разложения в ряды и полиномиальной интерполяции в математическом анализе.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.02.2011 |
Размер файла | 176,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Курсовой проект
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Нахождение рациональных корней многочлена с рациональными коэффициентами»
Введение
Целью данного проекта - является закрепление материала, изложенного в курсе «Программирование на языке высокого уровня» на основе какой-либо обобщающей задачи. В качестве таковой была выбрана задача нахождения рациональных корней уравнения с рациональными коэффициентами, т. к. она в достаточной степени полна, в плане разнообразия подзадач. Для обоснования выбора данной задачи охарактеризую её, в общих чертах.
Многочлены или полиномы от одной переменной - функции
Qn(x)= anxn + an-1xn-1+ ... a1x+ a0,
многочлен полиномиальный уравнение
где аi фиксированные коэффициенты, а x -- переменная. Многочлены составляют один из важнейших классов элементарных функций.
Изучение полиномиальных уравнений и их решений составляло едва ли не главный объект «классической алгебры». С изучением многочленов связан целый ряд преобразований в математике: введение в рассмотрение нуля, отрицательных, а затем и комплексных чисел, а также появление теории групп как раздела математики и выделение классов специальных функций в анализе.
Техническая простота вычислений, связанных с многочленами, по сравнению с более сложными классами функций, а также тот факт, что множество многочленов плотно в пространстве непрерывных функций на компактных подмножествах евклидова пространства, способствовали развитию методов разложения в ряды и полиномиальной интерполяции в математическом анализе.
Многочлены также играют ключевую роль в алгебраической геометрии, объектом которой являются множества, определённые как решения систем многочленов. Особые свойства преобразования коэффициентов при умножении многочленов используются в алгебраической геометрии, алгебре, теории узлов и других разделах математики для кодирования, или выражения многочленами свойств различных объектов.
Постановка задачи
Разработать подпрограмму для нахождения рациональных корней многочлена произвольной степени с рациональными коэффициентами.
Создание демонстрационной программы для показа найденного решения.
Коэффициенты могут быть заданы целыми числами, простыми дробями, смешанными числами и конечными и бесконечными десятичными дробями.
Теоретические сведения
В данной работе рассматриваются многочлены вида:
Pn(x) = x n+ x n-1+…+
Для поиска возможных рациональных корней применяется
Теорема о рациональных корнях многочлена
Eсли рациональное число является корнем многочлена с целыми коэффициентами Qn(x)= anxn + an-1xn-1+ ... a1x+ a0, то a0 делится на p и an делится на q.
Это дает возможность по коэффициентам a0 и an данного многочлена найти все рациональные числа, которые могут быть корнями Qn(x). Подставляя затем все эти числа, можно установить, какие из них действительно являются корнями Qn(x).
Для рациональных корней таких многочленов существуют алгоритмы нахождения перебором кандидатов с использованием схемы Горнера.
I. Преобразование коэффициентов
Так как коэффициенты многочлена могут быть представлены не только обыкновенными дробями , но и смешанным числами , бесконечным 0,(45) и конечными десятичными 0,05, то все коэффициенты следует обратить в обыкновенные дроби.
1) Перевод конечной десятичной дроби:
Для перевода достаточно в числителе дроби записать число, стоящее после запятой, а в знаменателе - единицу с нулями, причем нулей должно быть столько, сколько цифр справа от запятой. Например,
2) Перевод периодической дроби:
Для перевода нужно из числа, стоящее до второго периода, вычесть число, стоящее до первого периода, и записать эту разность числителем, а в знаменателе написать цифру 9 столько раз, сколько цифр в периоде, и после девяток дописать столько нулей, сколько цифр между запятой и первым периодом.
3) Перевод смешанного числа
Данная дробь будет неправильной.
Чтобы записать число в виде неправильной дроби, нужно умножить его целую часть на знаменатель дробной части и к произведению прибавить числитель дробной части. Полученная сумма будет числителем дроби, а знаменателем будет знаменатель дробной части.
II. Схема Горнера
Схема Горнера - алгоритм вычисления значения многочлена, записанного в виде суммы мономов, при заданном значении переменной. Метод Горнера позволяет найти корни многочлена.
Qn (x) = anxn + an-1xn-1+ ... +a1x+a0
Пусть требуется вычислить значение данного многочлена при фиксированном значении x = x0. Представим многочлен Qn (x) в следующем виде:
Qn (x) =((…(anx+ an-1) x+…a2)x+a1)x+a0
Определим следующую последовательность:
…
…
Искомое значение Qn(x0) = b0. Покажем, что это так.
В полученную форму записи Qn (x) подставим x = x0 и будем вычислять значение выражения, начиная с внутренних скобок. Для этого будем заменять подвыражения через bi:
Qn (x0)
Схема Горнера также является простым алгоритмом для деления многочлена на бином, вида (x - c),
При делении многочлена anxn + an-1xn-1+ ... +a1x+a0 на (x - c) получается многочлен (x-c)(bn-1xn-1 + bn-1-2xn-2+ ... b1x +b0)+r
Если r=0, то с-корень многочлена
Описание общего алгоритма
Пользователь вводит коэффициенты, которые могут быть представлены
- простыми дробями;
- смешанными числами.
- конечными и бесконечными десятичными дробями;
Преобразовываем коэффициенты в обыкновенные дроби и создаем динамический массив коэффициентов {a}i=0;n
Для нахождения корней многочлена преобразуем его в многочлен вида
Qn(x) = ( xn+xn-1+…+) = (anxn+an-1xn-1+…+a0), (1.2)
где z - НОК (Наименьшее Общее Кратное) для ( kn; kn-1; …; k0).
Для дальнейшего нахождения корней используем Теорему о рациональных корнях многочлена. В массиве Х будут храниться делители а0, в массиве У - делители аn.
Корни будем искать перебором
x1, x2,..., xm x1 x1 x1 x2 x2 x2
y1, y2,.., ym , поочередно y1, y2, …, ym, затем y1, y2,…, ym , и так далее.
Значение каждого кандидата подставляем в многочлен и вычисляем его значение, если оно равно 0, тогда этот кандидат является корнем многочлена, если нет, то выдаем сообщение, о том, что у данного многочлена корней нет.
Затем делим данный многочлена на бином (x-c), где с - найденный корень, по схеме Горнера. Получаем новый многочлен (x-c)
(bn-1xn-1 + bn-1-2xn-2+ ... b1x +b0).
Теперь ищем корень многочлена
(bn-1xn-1 + bn-1-2xn-2+ ... b1x +b0)
этим же способом. Продолжаем это до тех пока, степень многочлена не станет равной 1, у многочлена 1 степени находим корень, но дальнейшего деления не производим.
Описание структур данных
Коэффициенты многочлена хранятся в массиве (t_mas_k), расположенном в динамической памяти (t_p_mas_k). Элемент массива представляет собой запись (t_dr): одно поле - числитель дроби (ch), второе - знаменатель (zn).
Type
t_dr=record
ch,zn:longint;
end;
t_mas_k=array [0..65520 div sizeof(t_dr)] of t_dr;
t_p_mas_k=^t_mas_k;
Описание модулей
Модуль FRACTION для распознавания и работы с рациональными числами.
Модуль POLINOM для создания многочлена с рациональными коэффициентами и преобразование его к многочлену с целыми коэффициентами.
Модуль HORNER для нахождения корней многочлена по схеме Горнера.
Модуль FRACTION
Enter_error
Function Enter_error (str:string):boolean;
Просмотр строки str на наличие непредусмотренных символов. Возвращает значение True, если таковых не найдено и False в противном случае.
Входные параметры: str
Возврат: prov
Sign_drob
Function Sign_drob (str:string; var i:byte):shortint;
Определяет знак коэффициента многочлена sign. И номер позиции i для дальнейшего считывания.
Входные параметры: str
Выходные параметры: i
Возврат: sign
Int
Procedure Int (str:string; var d:t_dr);
Преобразовывает строку str, в которой записано целое число в обыкновенную дробь d.
Входные параметры: str
Выходные параметры: d
Ordinary_fraction
Procedure Ordinary_fraction (str:string; var d:t_dr);
Преобразовывает строку str, в которой записана обыкновенная дробь `7/8' в обыкновенную дробь d.
Входные параметры: str
Выходные параметры: d
Improper_fraction
Procedure Improper_fraction (str:string; var d:t_dr);
Преобразовывает строку str, в которой записана неправильная дробь `3+7/8' в обыкновенную дробь d.
Входные параметры: str
Выходные параметры: d
Decimal_fraction
Procedure Decimal_fraction (str:string; var d:t_dr);
Преобразовывает строку str, в которой записана десятичная дробь `3,78' в обыкновенную дробь d.
Входные параметры: str
Выходные параметры: d
Circulator_fraction
Procedure Circulator_fraction (str:string; var d:t_dr);
Преобразовывает строку str, в которой записана периодическая дробь `3,0(78)' в обыкновенную дробь d.
Входные параметры: str
Выходные параметры: d
Reduction_drob
Procedure Reduction_drob (var d:t_dr);
Сокращает дробь d.
Входные параметры: d
Выходные параметры: d
Mul_drob
Procedure Mul_drob (root,d_0:t_dr; var d:t_dr);
Перемножает две дроби root и d_0 и root, результат в d.
Входные параметры: d_0, root
Выходные параметры: d
Add_drob
Procedure Add_drob (d_0:t_dr; var d:t_dr);
Складывает две дроби d_0 и d, результат в d.
Входные параметры: d_0,d
Выходные параметры: d
NOD
Function NOD (x,y:longint):longint;
Возвращает НОД (Наибольший Общий Делитель) двух целых чисел x и y.
Входные параметры: x, y
Возврат: NOD
NOK
Function NOK (x,y:longint):longint;
Возвращает НОК (Наименьшее Общее Кратное) двух целых чисел x и y.
Входные параметры: x, y
Возврат: NOK
Модуль POLINOM
Create_polinom
Procedure Create_polinom (n:longint; var mas:t_p_mas_k);
Cоздает массив mas из коэффициентов многочлена n-ой степени.
Входные параметры: n
Выходные параметры: mas
Normalization;
Procedure Normalization (n:longint; var mas:t_p_mas_k);
Преобразует элементы массива mas, размером n, умножая их на общий знаменатель.
Входные параметры: n
Выходные параметры: mas
Модуль HORNER
Mas_roots
Procedure Mas_roots (n:longint; mas:t_p_mas_k; var x,y:t_mas; var k_x,k_y:longint);
Создает массив x, размером k_x числителей всех возможных корней многочлена из делителей коэффициента при нулевой степени.
Создает массив у, размером k_y массив знаменателей всех возможных корней многочлена из делителей коэффициента при старшей n степени.
Входные параметры: n, mas
Выходные параметры: x, y, k_x, k_y
Value_mnog
Procedure Value_mnog (n:longint; var mas:t_p_mas_k; var roots_mas:t_mas_dr; var size_r:longint; var flag:boolean);
Для многочлена n-ой степени, хранящегося в массиве mas находит возможные корни и записывает их в массив roots_mas размером size_r и устанавливает в логическую переменную flag значение FALSE, если нет ни одного такого корня.
Входные параметры: n, mas
Выходные параметры: roots_mas, size_r, flag
Decision
Procedure Decision (n:longint; var mas:t_p_mas_k);
Выводит на экран корни многочлена, коэффициенты которого хранятся в массиве mas, размером n.
Входные параметры: n, mas
Выходные параметры: нет
Тестовые данные
Заключение
В курсовом проекте было предусмотрено следующее:
· Преобразование целых, десятичных, периодических десятичных чисел и смешанных дробей и обыкновенные дроби;
· Считывание и распознавание введенных пользователем данных.
· Вычисление значения многочлена при помощи схемы Горнера;
· Деление многочлена степени >=2 на бином (x-c), где с - корень многочлена с помощью схемы Горнера.
· Вывод на экран корни искомого многочлена.
Список используемой литературы
1) Брусенцева В.С. Конспект лекций по программированию
2) Фаронов В. С. Учебное пособие Turbo Pascal
3) Гусев В.А., Мордкович А.Г. Математика. Справочные материалы
4) http://ru.wikipedia.org
Листинг
UNIT FRACTION;
INTERFACE
Type
t_dr=record
ch,zn:longint;
end;
Function Enter_error (str:string):boolean;
Function Sign_drob (str:string; var i:byte):shortint;
Procedure Int (str:string; var d:t_dr);
Procedure Ordinary_fraction (str:string; var d:t_dr);
Procedure Improper_fraction (str:string; var d:t_dr);
Procedure Decimal_fraction (str:string; var d:t_dr);
Procedure Circulator_fraction (str:string; var d:t_dr);
Procedure Reduction_drob (var d:t_dr);
Procedure Mul_drob (root,d_0:t_dr; var d:t_dr);
Procedure Add_drob (d_0:t_dr; var d:t_dr);
Function NOD (x,y:longint):longint;
Function NOK (x,y:longint):longint;
IMPLEMENTATION
Function Enter_error;
Type
mnog = set of char;
Const
mn: mnog = ['0'..'9','+','-','/',',','(',')'];
Var
prov:boolean;
len,i:byte;
Begin
len:=Length(str);
prov:=true;
i:=1;
while (i<=len) and prov do
begin
prov:=(str[i] in mn);
inc(i);
end;
Enter_error:=prov;
End;
Function Sign_drob;
Var sign:shortint;
Begin
i:=1;
sign:=1;
if str[i]='-' then
begin
sign:=-1;
inc(i);
end;
Sign_drob:=sign;
End;
{//////////////////////////////////////////////////}
Procedure Int;
Var
len,i:byte;
buf:longint;
sign:shortint;
Begin
len:=Length(str);
sign:=Sign_drob(str,i);
buf:=0;
while (i<=len) do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
d.ch:=buf;
d.zn:=1;
End;
Procedure Ordinary_fraction;
Var
len,i:byte;
ch,zn,buf:longint;
sign:shortint;
Begin
len:=Length(str);
sign:=Sign_drob(str,i);
buf:=0;
while (str[i]<>'/') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
ch:=buf;
buf:=0;
inc(i);
while (i<=len) do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
zn:=buf;
buf:=0;
d.ch:=ch*sign;
d.zn:=zn;
Reduction_drob(d);
End;
Procedure Improper_fraction;
Var
len,i:byte;
cel,ch,zn,buf:longint;
sign:shortint;
Begin
len:=Length(str);
sign:=Sign_drob(str,i);
buf:=0;
while (str[i]<>'+') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
cel:=buf;
buf:=0;
inc(i);
while (str[i]<>'/') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
ch:=buf;
buf:=0;
inc(i);
while (i<=len) do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
zn:=buf;
buf:=0;
d.ch:=(cel*zn+ch)*sign;
d.zn:=zn;
Reduction_drob(d);
End;
Procedure Decimal_fraction;
Var
len,i:byte;
k0,buf:longint;
sign:shortint;
Begin
len:=Length(str);
sign:=sign_drob(str,i);
buf:=0;
while (str[i]<>',') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
inc(i);
k0:=0;
while (i<=len) do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
inc(k0);
end;
d.ch:=buf*sign;
buf:=1;
for i:=1 to k0 do
buf:=buf*10;
d.zn:=buf;
Reduction_drob(d);
End;
Procedure Circulator_fraction;
Var
len,i:byte;
k0,k9,k,buf:longint;
sign:shortint;
Begin
len:=Length(str);
sign:=Sign_drob(str,i);
buf:=0;
while (str[i]<>',') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
end;
inc(i);
k0:=0;
while (str[i]<>'(') do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
inc(k0);
end;
k:=buf;
inc(i);
k9:=0;
while (i<len) do
begin
buf:=buf*10+(ord(str[i])-ord('0'));
inc(i);
inc(k9);
end;
d.ch:=(buf-k)*sign;
buf:=0;
for i:=1 to k9 do
buf:=buf*10+9;
for i:=1 to k0 do
buf:=buf*10;
d.zn:=buf;
Reduction_drob(d);
End;
{//////////////////////////////////////////////////}
Procedure Reduction_drob;
Var x:longint;
Begin
x:=NOD(d.ch,d.zn);
d.ch:=d.ch div x;
d.zn:=d.zn div x;
End;
Procedure Mul_drob;
Begin
d.ch:=d_0.ch*root.ch;
d.zn:=d_0.zn*root.zn;
Reduction_drob(d);
End;
Procedure Add_drob;
Var n,m:longint;
Begin
n:=NOK(d_0.zn,d.zn);
m:=(n div d_0.zn)*d_0.ch+(n div d.zn)*d.ch;
d.ch:=m;
d.zn:=n;
Reduction_drob(d);
End;
Function NOD;
Var z:longint;
Begin
z:=x mod y;
While z <> 0 do
begin
x:=y;
y:=z;
z:=x mod y;
end;
NOD:=y;
End;
Function NOK;
Var z:longint;
Begin
z:=NOD(x,y);
NOK:=(x*y) div z;
End;
END.
UNIT POLINOM;
INTERFACE
Uses FRACTION;
Type
t_mas_k=array [0..65520 div sizeof(t_dr)] of t_dr;
t_p_mas_k=^t_mas_k;
Procedure Create_polinom (n:longint; var mas:t_p_mas_k);
Procedure Normalization (n:longint; var mas:t_p_mas_k);
IMPLEMENTATION
Procedure Create_polinom;
Type
mnog = set of char;
Var
size_m:longint;
d:t_dr;
str:string;
mn_str: mnog;
len,i:byte;
j:integer;
prov:boolean;
Begin
size_m:=(n+1)*sizeof(longint);
if size_m<=MaxAvail
then GetMem(mas,size_m)
else
begin
WriteLN ('Net pamjati');
mas:=nil;
end;
for j:=n downto 0 do
begin
mas^[j].ch:=0;
mas^[j].zn:=1;
end;
j:=n;
while (j>=0) do
begin
Writeln (' Vvedite koefficient ', j,' stepeni');
Write (' ');
Readln (str);
if Enter_error(str)
then
begin
prov:=true;
mn_str:=[];
len:=length(str);
For i:=1 to len do
mn_str:=mn_str+[str[i]];
mn_str:=mn_str-['0'..'9','-'];
if mn_str=[] then
begin
Int (str,d);
prov:=false;
end;
if ('/' in mn_str) then
if ('+' in mn_str)
then
begin
Improper_fraction (str,d);
prov:=false;
end
else
begin
Ordinary_fraction (str,d);
prov:=false;
end;
if (',' in mn_str) then
if ('(' in mn_str) and (')' in mn_str)
then
begin
Circulator_fraction (str,d);
prov:=false;
end
else
begin
Decimal_fraction (str,d);
prov:=false;
end;
mas^[j].ch:=d.ch;
mas^[j].zn:=d.zn;
if prov
then WriteLN('EpicFail')
else dec(j);
end
else
Writeln ('Ne dopustimoe znachenie, povtorite vvod');
end;
End;
Procedure Normalization;
Var
i:word;
x,y,domn,domn0:longint;
Begin
i:=0;
domn:=0;
x:=mas^[i].zn;
y:=mas^[i+1].zn;
domn:=NOK(x,y);
mas^[i].ch:=(domn div mas^[i].zn)*mas^[i].ch;
mas^[i].zn:=domn;
mas^[i+1].ch:=(domn div mas^[i+1].zn)*mas^[i+1].ch;
mas^[i+1].zn:=domn;
inc(i);
while i<n do
begin
x:=mas^[i].zn;
y:=mas^[i+1].zn;
domn0:=NOK(x,y);
if domn0>domn then domn:=domn0;
inc(i);
end;
for i:=0 to n do
begin
mas^[i].ch:=(domn div mas^[i].zn)*mas^[i].ch;
mas^[i].zn:=1;
end;
End;
END.
UNIT HORNER;
INTERFACE
Uses FRACTION, POLINOM;
Type
t_mas_dr=array [1..500 div sizeof(t_dr)] of t_dr;
t_mas=array [1..500 div sizeof(longint)] of longint;
Procedure Value_mnog (n:longint; var mas:t_p_mas_k; var roots_mas:t_mas_dr; var size_r:longint; var flag:boolean);
Procedure Decision (n:longint; var mas:t_p_mas_k);
IMPLEMENTATION
Procedure Mas_roots (n:longint; mas:t_p_mas_k; var x,y:t_mas; var k_x,k_y:longint);
Var
x0,y0:longint;
i,j:byte;
Begin
x0:=ABS(mas^[0].ch);
y0:=ABS(mas^[n].ch);
j:=0;
for i:=1 to x0 do
begin
if (x0 mod i = 0) then
begin
inc(j);
x[j]:=i;
end;
end;
k_x:=j;
j:=0;
for i:=1 to y0 do
begin
if (y0 mod i = 0) then
begin
inc(j);
y[j]:=i;
end;
end;
k_y:=j;
End;
Procedure Value_mnog;
Var
i,j,k:byte;
prov:boolean;
s,d,d0:t_dr;
size_m,size_m0,m,k_x,k_y:longint;
mas0:t_p_mas_k;
root:t_dr;
x,y:t_mas;
Begin
Mas_roots (n,mas,x,y,k_x,k_y);
prov:=true;
i:=1;
while (i<=k_x) and prov and (n>=1) do
begin
j:=1;
while (j<=k_y) and prov and (n>=1) do
begin
d.ch:=x[i];
d.zn:=y[j];
d0:=d;
Reduction_drob(d);
root:=d;
s.ch:=0;
s.zn:=1;
for k:=n downto 0 do
begin
Mul_drob (root,s,d);
Add_drob (mas^[k],d);
s:=d;
end;
if (s.ch=0)
then
begin
roots_mas[size_r].ch:=d0.ch;
roots_mas[size_r].zn:=d0.zn;
prov:=false;
flag:=true;
if (n>1) then
begin
size_m0:=n*sizeof(longint);
if size_m0<=MaxAvail
then GetMem(mas0,size_m0)
else mas0:=nil;
mas0^[n-1]:=mas^[n];
m:=n-2;
for i:=m downto 0 do
mas0^[i].zn:=1;
for i:=m downto 0 do
begin
Mul_drob (root,mas0^[i+1],d);
Add_drob (d,mas^[i+1]);
mas0^[i]:=mas^[i+1];
end;
FreeMem (mas, size_m);
mas:=mas0;
inc(size_r);
dec(n);
Value_mnog (n, mas, roots_mas, size_r, flag);
end;
end
else inc(j);
end;
inc(i);
end;
if prov
then
begin
i:=1;
while (i<=k_x) and (n>=1) and prov do
begin
j:=1;
while (j<=k_y) and (n>=1) and prov do
begin
d.ch:=-x[i];
d.zn:=y[j];
d0:=d;
Reduction_drob(d);
root:=d;
s.ch:=0;
s.zn:=1;
for k:=n downto 0 do
begin
Mul_drob (root,s,d);
Add_drob (mas^[k],d);
s:=d;
end;
if (s.ch=0)
then
begin
roots_mas[size_r].ch:=d0.ch;
roots_mas[size_r].zn:=d0.zn;
prov:=false;
flag:=true;
if (n>1) then
begin
size_m0:=n*sizeof(longint);
if size_m0<=MaxAvail
then GetMem(mas0,size_m0)
else mas0:=nil;
prov:=false;
mas0^[n-1]:=mas^[n];
m:=n-2;
for i:=m downto 0 do
mas0^[i].zn:=1;
for i:=m downto 0 do
begin
Mul_drob (root,mas0^[i+1],d);
Add_drob (d,mas^[i+1]);
mas0^[i]:=mas^[i+1];
end;
FreeMem (mas, size_m);
mas:=mas0;
inc(size_r);
dec(n);
Value_mnog (n,mas,roots_mas,size_r, flag);
end;
end
else inc(j);
end;
inc(i);
end;
end;
End;
Procedure Decision;
Var
size_r,i:longint;
roots_mas:t_mas_dr;
prov:boolean;
Begin
for i:=1 to n do
begin
roots_mas[i].ch:=0;
roots_mas[i].zn:=1;
end;
size_r:=1;
prov:=false;
Value_mnog (n,mas,roots_mas,size_r,prov);
if prov
then
begin
if (size_r>1)
then WriteLN ('Korni mnogochlena:')
else WriteLN ('Koren mnogochlena:');
for i:=1 to size_r do
if (roots_mas[i].ch<>0)
then
if (roots_mas[i].zn=1)
then WriteLN (roots_mas[i].ch)
else WriteLN (' ',roots_mas[i].ch, '/', roots_mas[i].zn);
end
else
WriteLN ('U dannogo mnogochlena korney net')
End;
END.
PROGRAM RAT_POL;
Uses FRACTION, POLINOM, HORNER, CRT;
Var
n:longint;
mas:t_p_mas_k;
BEGIN
ClrScr;
WriteLN ('"Nahojdenie racionalnyh korney mnogochlena s racionalnymi koefficientami"':74);
WriteLN;
WriteLN ('Vvedite koefficienty mnogochlena, kotorye mogut byt zadany:');
WriteLN;
WriteLN ('-obyknovennaya drob 7/8');
WriteLN ('-nepravilnaya drob 3+7/8');
WriteLN ('-desyatichnaya drob 3,78');
WriteLN ('-periodicheskaya drob 3,0(78)');
WriteLN;
Write ('Vvedite stepen mnogochlena:');
Readln(n);
Create_polinom(n,mas);
Normalization(n,mas);
Decision(n,mas);
ReadKey;
END.
Размещено на Allbest.ru
Подобные документы
Нахождение собственных чисел и разработка фундаментальной системы решений. Построение фундаментальной матрицы методом Эйлера. Зависимость Жордановой формы матрицы А от ее собственных чисел. Решение задачи Коши. Построение фазового портрета в MATLAB.
курсовая работа [1,4 M], добавлен 20.12.2013Основная теорема существования корней в С+, ее доказательство с помощью нескольких лемм. Распределение корней на плоскости комплексной переменной. Распределение вещественных корней полинома с вещественными коэффициентами. Приближенное вычисление корней.
контрольная работа [469,4 K], добавлен 06.03.2013Нахождение с заданной погрешностью корней уравнения. Оценка скорости сходимости. Нахождение промежутка, в котором содержится какой-либо корень уравнения для методов итераций и Ньютона. Разработка текста компьютерных программ для решения данных уравнений.
лабораторная работа [253,9 K], добавлен 19.12.2012Программный продукт, способный решать уравнения с одной переменной методом Ньютона (касательных). Он прост в эксплуатации, имеет интуитивно понятный интерфейс, выстраивает график уравнения, что очень важно для пользователя. Реализация решений в программе.
курсовая работа [169,3 K], добавлен 29.01.2009Изучение численных методов решения нелинейных уравнений, используемых в прикладных задачах. Нахождение корня уравнения методом простой итерации и методом касательных (на примере уравнения). Отделение корней графически. Программная реализация, алгоритм.
курсовая работа [1,7 M], добавлен 15.06.2013Составление алгоритма и программного обеспечения для реализации конечноразностных интерполяционных формул Ньютона, Гаусса и Стирлинга. Описание метода полиномиальной интерполяции. Изучение метода оптимального исключения для решения линейных уравнений.
курсовая работа [19,8 K], добавлен 25.12.2013Выполнение отделения корней для заданной функции. Описание уточнения корней с использованием метода дихотомии, Ньютона, простой итерации. Выявление абсолютной погрешности методов. Создание листинга программ. Рассмотрение результатов работы программ.
лабораторная работа [16,1 K], добавлен 19.04.2015Сущность теории приближений и характеристика интерполяции как процесса получения последовательности интерполирующих функций. Полиномы Эрмита и интерполирование с кратными узлами. Программная разработка приложения по оценке погрешности интерполирования.
курсовая работа [1,1 M], добавлен 05.06.2014Написание программы для вычисления функции f(x), изображенной на графике, используя оператор if. Построение графика функции. Составление программы, вычисляющей сумму 101 из последовательно расположенных нечетных чисел. Нахождение корней системы уравнений.
контрольная работа [694,4 K], добавлен 07.08.2013Особенности решения уравнений с одной переменной методом половинного деления. Оценка погрешности метода простой итерации. Суть решения уравнений в пакете Mathcad. Векторная запись нелинейных систем. Метод Ньютона решения систем нелинейных уравнений.
курсовая работа [2,1 M], добавлен 12.12.2013