Решаване на квадратно уравнение, Диофантово уравнение, метод на Хорнер

Всяко уравнение се състои от два аритметични израза свързани със знака за равенство. Прието е променливите да се изписват с последните букви от латинската азбука - като x, y, z. Параметрите на уравнението са числа. При представяне на уравнение параметрите се бележат с началните букви на латинската азбука - като a, b, c.

решаване на квадратно уравнение
решаване на непълно квадратно уравнение
формули на Виет (Vieta)
обратна теорема на Виет
решаване на уравнение по метод на Хорнер
решаване на Диофантово уравнение

решаване на квадратно уравнение

Нека имаме уравнение, при което коефициентът пред най-високата степен на неизвестното е различен от 0, а най-високата степен на уравнението с ненулев коефициент пред него е 2. Такова уравнение ще наричаме квадратно уравнение. Едно квадратно уравнение се задава чрез стойностите на коефициентите пред неизвестното A, B, както и на свободния член C.

Чрез знака ^ изразяваме степенуване, а sqrt - е функция за корен квадратен.

Ax^2 + Bx + C = 0
Нека разгледаме последователно възможните решения:
1) при A=0, уравнението е линейно и има едно единствено решение (при B<>0) x = -C/B
2) при C = 0 уравнението придобива вида: A*x^2 + Bx = 0 и има корени x = -B/A, както и x = 0
3) изчисляваме дискриминантата D=B*B - 4*A*C.
Ако D = 0 уравнението има само един корен X1=-B/2A. В блок схемата този случай се представя като двоен корен на уравнението.
Ако D >0 това квадратно уравнение има следните реални корени (с sqrt означаваме функцията корен квадратен):
X1= (-B - sqrt (D)) / (2*A)
X2= (-B + sqrt (D)) / (2*A)
Ако D < 0 това квадратно уравнение има следните комплексни корени:
X1= (-B - i*(sqrt (D)) / (2*A)
X2= (-B + i*(sqrt (D)) / (2*A)
Където i е имагинерната единица имаща стойност sqrt (-1)
В този случай корените на това квадратно уравнение са комплексно спрегнати - имат една и съща реална част и различни по знак, но с еднаква абсолютна стойност имагинерна част.

Следващата примерна програма реализира алгоритъм за решаване на квадратно уравнение.
  #include<iostream>
  using namespace std;
  #include <stdlib.h>
  #include <cmath>

int main()
{  int a,b,c;
   double re1,re2,D,D1;
 cout<<"Da se systawi programa, chrez koqto se wywevdat 3 estestwen\n";
 cout<<"chisla A, B, C predstawlqwashi koeficientite na kwadratno urawnenie\n";
 cout<<"se izchislqt wyzmovnite koreni na towa urawnenie.\n";
 cout<<"Primer 1 -5 6 Izhod 2,3.\n";
 cout<<endl;
 cout<<"Molq, wywedete stojnostta na koeficientite!\n";
 cout<<"Wywedete koeficienta A:  "; cin>>a;
 cout<<"Wywedete koeficienta B: "; cin>>b;
 cout<<"Wywedete koeficienta C: "; cin>>c;
  if (a==0) //koeficienta pred kwadrata na neizwestnoto
    { if (b==0) cout<<"towa urawnenie nqma reshenie\n";
     else {re1=(double)-c/b;
     cout<<" towa urawnenie ima edinstwen koren "<<re1<<endl;}
   }//if (a==0)
   else {// (a==0)
      D1=(double)b*b - 4 * a*c;//towa sa celi chisla
     cout<<"Koreni na towa urawnenie sa: ";
     if (D1>=0)
      { D=sqrt(D1);//ako D1<0 nqma realni koreni
        re1=-D-b;   re1/=(2*a);//formuli na Wiet
        re2=D-b;    re2/=(2*a);
        cout<<re1;
        if (D!=0) cout<<"; "<<re2<<endl; else  cout<<endl;
   //ako korena e samo 1 t.e. diskriminanta na 0
   }
     else {//(D1=>0)
       cout<<"\n towa urawnenie nqma realni koreni!\n";
      }// else (D1=>0)
    }
  system ("pause");
  return 0;
 }//kraj na programa kwadratno urawnenie  

Начало на страницата


решаване на непълно квадратно уравнение

Ако в квадратното уравнение от вида Ax^2 + Bx + C един от кеофициентите A или B е равен на нула казваме, че това е непълно квадратно уравнение. Имаме две възможности: 1) B = 0 - уравнението има реални корени само, ако знаците пред коефициенти A и C са различни. В този случай x1 = - sqrt( C/A); x2 = sqrt( C/A); ако и c = 0 уравнението има единствен корен 0.
2) C = 0 - уравнението има корени x = 0 и x = - sqrt(B/A)

Следващата примерна програма дава решена задача за непълно квадратно уравнение от вида Ax^2 + C = 0

#include <iostream>
#include <cmath>
using namespace std;

double A,C;
#define koren sqrt(-C/A)

int main ()
{ cout<<"Da se systawi programa, chrez koqto se wywevdat \n";
cout<<"koeficienti A i C w nepylno kwadratno urawnenie ot wida Ax*x + C =0.\n";
cout<<"Programata da izweve izchislenite koreni na towa kwadratno urawnenie.\n";
cout<<"Primer A=2 C=-8 Izhod: -2, 2\n";
cout<<"Wywedete koeficient A: ";cin>>A;
cout<<"Wywedete koeficient C: ";cin>>C;
if ((A<0 && C>0) || (A>0 && C<0))
{ cout<<"Towa urawnenie ima koren x1 = "<<-1 * koren <<"; x2 = "<< koren <<endl;}
else cout<<"Towa urawnenie ima kompleksni koreni\n";
system ("pause");
return 0;
}// nepylno kwadratno urawnenie

Начало на страницата


формули на Виет (Vieta)

Френският математик Франсоа Виет (Vieta) пръв въвежда буквените означения за коефициентите на уравнение за получаване на общи доказателства. В неговите трудовете по математика се описват и случай за уравнения с по-висока степен от 2. Чрез формулите на Виет могат да се изразяват зависимостите между коефициентите пред неизвестното в дадено уравнение и неговите корени. Ще разгледаме случай за квадратно уравнение, представено чрез коефициентите A, B, C.

Ax^2 + Bx +C = 0, съответно с корени x1, x2.
x1 + x2 = - B/A; p=-B/A
x1 * x2 = C/A; q= C/A
Приема се, че коефициента А е положителна стойност.
Ако корените са реални е възможно да се определят знаците на корените без да се решава самото уравнение. От предходните два реда могат да се извадят следните изводи: ако произведението на двата корена има стойност <0, то корените са с различен знак, както и обратното корените са с еднакъв знак, ако тяхното произведение е >0; ако сумата на двата корена е 0, то корените са с еднаква абсолютна стойност и различни по знак.

Следващата примерна програма илюстрира обработване на данни за коефициенти на квадратно уравнение чрез формули на Виет:
#include <iostream>
using namespace std;

int main()
{ double  a,b,c, sum, proiz;
 cout<<"Da se systawi programa, chrez koqto se wywevdat 3 stojnosti ot\n";
 cout<<"interwala [-99..99] i se izwevda sumat i proizwedenie ot \n";
 cout<<"korenite na kwadratno uweanenie.\n";
 cout<<"Primer: 1, -9, 20 Izhod 9,20\n";
 cout<<"Wywedete koeficient A: ";cin>>a;
 cout<<"Wywedete koeficient B: ";cin>>b;
 cout<<"Wywedete koeficient C: ";cin>>c;
 if (a) {
 sum=-b/a;//  x1 + x2
 proiz=c/a;//  x1 * x2
 cout<<" suma ot koreni w urawnenie "<<sum<<endl;
 cout<<" proizwedenie koreni na urawnenie "<<proiz<<endl;
  if (c){
  if (c>0) cout<<"Korenite sa s ednakwi znaci.\n";
  if (c<0) cout<<"Korenite sa s razlichni znaci.\n";
  } else cout<<"Pone edin ot korenite e 0.\n";
} else cout<<"Wywedenite danni sa za linejno urawnenie.\n";
system("pause");
return 0;
}//programa kwadratno uweanenie

Начало на страницата


обратна теорема на Виет

Съществува теорема, обратна на описаната теорема на Виет, която гласи следното: която ако две числа x1 и x2 изпълняват условията x1 + x2 = − p и x1.x2 = q, то тези числа x1, x2 са корени на уравнението x2 + px + q = 0.

Следващата примерна програма илюстрира обработване на данни за квадратно уравнение чрез обратната на Виет теорема:
#include <iostream>
using namespace std;

int main()
{ double  sum, proiz,x1,x2;
 cout<<"Da se systawi programa, chrez koqto se wywevdat 2 stojnosti ot\n";
 cout<<"interwala [-99..99] i se izwevda koeficientite na kwadratno uweanenie.\n";
 cout<<"Primer: 4,5 Izhod 1, -9, 20\n";
 cout<<"Wywedete stojnost za x1: ";cin>>x1;
 cout<<"Wywedete stojnost za x2: ";cin>>x2;
 sum=-1*(x1+x2);//  x1 + x2
 proiz=x1*x2;//  x1 * x2
 cout<<" kwadratnoto urawnenie ima wida:\n";
 cout<<"1x^2 ";
  if (sum<0) cout<<sum<<"x "; else cout<<" + "<<sum<<"x ";
  if (proiz<0) cout<<proiz; else cout<<"+ "<<proiz;
 cout<<" = 0\n";
system("pause");
return 0;
}// programa kwadratno urawnenie 

Начало на страницата


решаване на уравнение по метод на Хорнер

Предложеният от английският математик Хорнер (William George Horner) алгоритъм за намиране корени на квадратно уравнение и от по-висока степен се състои в следното:
Рационалните корени на уравнение или нули на полином са числата от вида p/q, където с p се означават всички делители на свободния член, с q всички делители на коефициента пред най-високата степен в разглежданото уравнение / полином. Уравнението може да има за корени цели числа, ако свободния член се дели без остатък на коефициента пред най-високата степен в уравнението. Корени на това уравнение могат да бъдат делителите на свободния член взети със знак минус и плюс. В процеса на търсене корените на въведеното уравнение се вземат се само коефициентите пред съответните степени. Ако дадена степен липсва в данните за това уравнение като коефициент на съответното място се записва 0. Така при описанието на алгоритъма приемаме, че всички коефициенти в разглежданото уравнение са цели числа или нула, степените на неизвестното са подредени в низходяща наредба. Задачата за решаване на уравнение по метода на Хорнер значително се облекчава ако коефициентът пред най-високата степен е винаги 1. Избраното за корен число (записано в най-лявата част на таблицата) се умножава с коефициента пред най-високата степен и се събира със следващия го коефициент. Ако последната сума се получи 0, то това число е корен на уравнението. Проверката продължава с получените нови коефициенти – при търсене на нов корен за уравнението. Едно уравнение може да има няколко корена с една и съща стойност. Проверява се дали вече намерен корен на уравнението не се повтаря. Предимство на метода на Хорнер, е че проверката дали дадено число е корен се състои в умножение и събиране, т.е. не налага вдигане на степен. Друго предимство, е че след намиране на един или повече корени максималната степен на това уравнение вече се намалява с 1.

Следващата примерна програма дава решена задача за решаване на уравнение по метода на Хорнер:
#include <iostream>
using namespace std;
int mas[100];

int Wywedi(int mas[])
{ char ose;
   int broi=0;
    do {
   cout<<"Wywedete koeficient za stepen: "<<broi<<": ";   
   cin>>mas[broi];
   cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
   broi++;
 } while (ose=='y');
  return broi-1;
}//Wywedi

int Horner ( int stepen, int kolko)
{int i,rez,koren,kor;
  for (i=stepen;i>=kolko;i--) cout<<mas[i]<<"; ";
  cout<<endl;
  cout<<"Wywedete stojnost za koren: ";cin>>koren;
  rez=mas[stepen];
  for (i=stepen;i>=kolko;i--)
   {if (i<stepen) rez=rez*koren + mas[i];
    cout<<rez<<" ";
 } //for
  cout<<endl; 
 
  if (rez) kor=kolko; //urawnenie - zapazwa maksimalnata stepen
 else //ako e otkrit koren redukciq broq na koeficientite
  { cout<<"Chisloto "<<-1*koren<<" e koren na urawnenieto.\n";
    for (i=stepen-1;i>=kolko;i--)    { mas[i]+=mas[i+1]*koren;}
   kor=kolko+1;//nulewata stepen se mesti s 1 poziciq nalqwo
   // urawnenie - namalqwa stepenta si s -1
   }
 return kor;
}// Horner - prowerqwa dali chisloto e koren na urawnenie    

int main()
{ int stepen, kor,br_step;
  char ose;
  cout<<"Imate urawnenie ot stepen N, predstaweno s koeficientite pred \n";
  cout<<"wsqka ot stepenite na neizwestnoto. Koeficientite sa celi chisla\n";
  cout<<"ot interwala [-100..100]. Da se systawi programa, chrez koqto\n";
  cout<<"se tyrsqt korenite na urawnenie po metod na Horner.\n";
  cout<<"Stepennite pokazateli se wywevdat ot 0-lewa do N-tata stepen.\n";
  cout<<"Primer:4 4 1 koren -2  Izhod: Da\n";
  br_step=kor=0;
  stepen=Wywedi( mas);// stepen na polinom 
  do {
   br_step=Horner(   stepen, kor);//dali se reducira, t.e. dali e otkrit koren
    kor=br_step;
    cout<<"She prowerqwate li drug koren <y/n>: ";cin>>ose;
  } while (ose=='y');
  system("pause");
  return 0;
}//programa urawnenie po metod na Horner

Начало на страницата


решаване на Диофантово уравнение

Уравнение от вида a*x + b*y = c, където a,b,c са произволни цели числа ще наричаме Диофантово уравнение от първа степен. Ако указаните коефициенти са рационални числа може да бъде намерено тяхното най-малко общо кратно и отново да получим уравнение с цели числа. В следващата примерна програма ще разглеждаме коефициентите в конкретно Диофантово уравнение само като цели числа. От теоретичните изследвания е доказано съществуването на необходимо и достатъчно условие едно Диофантово уравнение от вида ax + by = c да има поне едно решение с цели числа е най-големият общ делител на a и b да дели с. Този делител може да бъде и 1, т.е. коефициентите a,b са взаимно прости числа. Ако коефициентите a, b, c имат общ делител - НОД, то чрез делене можем да редуцираме коефициентите в уравнението. Да разгледаме следната примерна задача: Имаме въведени коефициенти a,b,c на Диофантово уравнение. Търсим дали това уравнение има за корени цели числа от даден числов интервал. Ще използваме метода на грубата сила – като проверим с вложен цикъл дали за конкретни целочислени стойности двете части на това Диофантово уравнение са равни.

Следващата примерна програма дава решена задача за решаване на Диофантово уравнение:

#include<iostream>
using namespace std;

void Diofantowo ()
{int ch_x,ch_y,ch_z,x,y,z,granica,resh;
  cout<<"A, B, C, Granica sa estestweni chisla ot interwala [0..30000]: "<<endl;
  cout<<"  koeficienta A: ";cin>>ch_x;
  cout<<"  koeficienta B: ";cin>>ch_y;
  cout<<" koeficienta C: ";cin>>ch_z;
  cout<<"Wywedete dopustim interwal za tyrsene: ";cin>>granica;
  resh=0;//za wsqko neizwestno se tyrsi do razmera na swobodniq chlen - sum
 for(x=0;x<=granica;x++)
   {//nachalo for x
    for(y=0;y<=granica;y++)
    {//nachalo for y
   if (ch_z==ch_x*x+ch_y*y)
     { cout <<"Wyzmovno reshenie: x="<< x << " y=" << y << endl;
       resh=1;}// pone edno reshenie
    if (ch_z==-1*ch_x*x+ch_y*y)
     { cout <<"Wyzmovno reshenie: x="<< -1*x << " y=" << y << endl;
       resh=1;}//pone edno reshenie
   if (ch_z==-1*ch_x*x-ch_y*y) 
     { cout <<"Wyzmovno reshenie: x="<< -1*x << " y=" << -1*y << endl;
      resh=1;}//pone edno reshenie
   if ( ch_z==ch_x*x-ch_y*y)
     { cout <<"Wyzmovno reshenie: "<< x << " y=" << -1*y << endl;
       resh=1;}//pone edno reshenie                        
     }// for y
   }// for x
    if (resh<1) {cout<<"Nqma resheniq w oblastta na celite chisla!"<<endl;}
 } // Diophantowo urawnenie  

int main() 
{// izcherpwasho tyrsene - warianti za koreni na Diophantowo urawnenie
 char ose;
 cout<<"Systawete programa, koqto reshawa Diophantowoto urawnenie Ax+By=C\n";
 cout<<"kydeto A, B, C sa estestweni chisla, kakto i interwal z tyrsene N. \n";
 cout<<"Primer: -13, 25, 2, 5 Izhod: x=-4 y=-2 c=2\n";
  do {
    Diofantowo ();
    cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
   } while (ose=='y');
   system("pause"); 
    return 0;
}// programa Diophantowo urawnenie  

Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: