1-AMALIY ISHI
Mavzu: Algoritmlarni loyixalashga. Algoritm korrekt va samaradorligini
baholash . Kvadrat tenglama ildizlarini aniqlash algoritmi. Uchburchak
yuzasi uchun Geron formulasi.
Ishdan maqsad: Algoritmlarni samaradorligini baholash. Kvadrat va kubik
tenglama ildizlarini aniqlash algoritmini ishlab chiqish.
Nazariy qism
Kvadrat tenglama ildizlarini aniqlash
Kvadrat tenglamaning ildizlarini topish vazifasi, boshqa ko'plab vazifalar
singari, oson vazifadir. Uni qog’oz va qalam yordamida juda oson yechish mumkin,
ammo algoritmni to’gri tanlab dasturini tuzish va undan foydalanish orqali yechimni
avtomatlashtirish mumkin. Ushbu laboratoriyada biz shunday dastur algoritmini
ko’rib chiqamiz.
Bilamizki, 𝒂𝒙𝟐 + 𝒃𝒙 + 𝒄 = 𝟎 ko’rinishidagi tenglama kvadrat tenglama
deyiladi. Ushbu tenglamani yechishning bir necha usullari mavjud. Ammo biz,
Diskriminantlar usulidan foydalanamiz. Chunki bu usul dasturlash uchun eng
optimal usul hisoblanadi.
Diskriminant D harfi bilan belgilanadi. D= b2-4ac ekanligini esa, maktab
kursidan bilamiz.
Diskriminant uchun bir nechta shartlar mavjud:
Agar D> 0 bo'lsa, unda tenglama 2 xil haqiqiy ildizga ega.
Agar D = 0 bo'lsa, unda yagona ildizga ega yoki, ikkala haqiqiy ildiz teng
bo'ladi.
Agar D <0 bo'lsa, unda yechimga ega emas yoki, ikkala ildiz ham
kompleks sonlardir.
Yechish algoritmi juda oddiy. Diskriminant hisoblanadi, agar u 0 dan katta
yoki unga teng bo'lsa, u holda ildizlar quyidagi formula yordamida hisoblanadi:
yoki
Kvadrat tenglama ildizlarini topish algoritmining blok sxemasini quyida
ko’rishimiz mumkin.
Boshlash
Kiritish: a,b,c
D=b2-4ac
Yo’q
𝑥1 =
−b − √𝐷
2∗𝑎
𝑥2 =
−b + √𝐷
2∗𝑎
D<0
ha
Chiqarish:
“Tenglama
ildizga ega
emas”
Chiqarish:
x1, x1
Yakunlash
Kubik tenglama ildizlarini aniqlash
Kub tenglamaning yechimi:
Ushbu tajriba ishida kubik tenglamani Vieta-Kardano usuli yordamida yechish
algoritmi keltirilgan. Dastur faol(0 dan farqli) koeffitsientlar holati uchun yozilgan
(ildizlar murakkab bo'lishi mumkin).
Kub tenglamasi quyidagicha yoziladi:
x3+a*x2+b*x+c=0.
Haqiqiy koeffitsientlar bo'lsa, uning ildizlarini topish uchun birinchi navbatda
quyidagilar hisoblanadi:
Q=(a2-3b)/9, R=(2a3-9ab+27c)/54.
Bundan tashqari, agar R2<Q3 bo'lsa, tenglama formulalar bilan hisoblangan
uchta haqiqiy ildizga ega (Vieta):
t=acos(R/sqrt(Q3))/3,
x1=-2*sqrt(Q)cos(t)-a/3,
x2=-2*sqrt(Q)cos(t+(2*pi/3))-a/3,
x3=-2*sqrt(Q)cos(t-(2*pi/3))-a/3.
R2>=Q3 bo'lgan holatda, bitta (umumiy holat) yoki ikkita (degenerativ
holatlar) haqiqiy ildiz mavjud. Haqiqiy ildizdan tashqari, ikkita kompleks ildizi
mavjud. Ularni topish uchun quyidagilar hisoblab chiqiladi (Kardano formulasi):
A=-sign(R)[|R|+sqrt(R2-Q3)]1/3,
A!=0 bo’lsa B=Q/A yoki A=0 bo’lganda B=0 .
Haqiqiy ildiz quyidagicha bo'ladi:
x1=(A+B)-a/3.
Kompleks ildizlar:
x2,3=-(A+B)/2-a/3 + i*sqrt(3)*(A-B)/2
Agar A=B bo'lsa, unda kompleks ildizlar haqiqiyga aylanadi:
x2=-A-a/3.
Cardano va Vieta formulalari maxsus funktsiyalardan foydalanishni talab
qiladi va agar koeffitsientlari juda ko'p o'zgarmaydigan kub tenglamaning
ildizlarini hisoblashning katta seriyasini amalga oshirish kerak bo'lsa, boshqa tez
tezkor algoritmdan foydalanish kerak: (Kardano-Vyeta yordamida dastlabki
yaqinlashuvni topish bilan) Nyuton usuli yoki boshqa iterativ usullar
Quyida haqiqiy koeffitsientli kub tenglamaning ildizlarini topish dasturi
keltirilgan:
𝑥 3 + 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0
(agar tenglama koeffitsientlari bu ko’rinishda bo’lmasa shu holatga keltiriladi)
#include <math.h> /* for sqrt(), fabs(), pow(), cos(), acos(). */
#include <iostream>
//#define M_PI (3.141592653589793)
#define M_2PI (2.*M_PI)
using namespace std;
int Cubic(double *x,double a,double b,double c) {
double q,r,r2,q3;
q=(a*a-3.*b)/9.; r=(a*(2.*a*a-9.*b)+27.*c)/54.;
r2=r*r; q3=q*q*q;
if(r2<q3) {
double t=acos(r/sqrt(q3));
a/=3.; q=-2.*sqrt(q);
x[0]=q*cos(t/3.)-a;
x[1]=q*cos((t+M_2PI)/3.)-a;
x[2]=q*cos((t-M_2PI)/3.)-a;
return(3);
}
else {
double aa,bb;
if(r<=0.) r=-r;
aa=-pow(r+sqrt(r2-q3),1./3.);
if(aa!=0.) bb=q/aa;
else bb=0.;
a/=3.; q=aa+bb; r=aa-bb;
x[0]=q-a;
x[1]=(-0.5)*q-a;
x[2]=(sqrt(3.)*0.5)*fabs(r);
if(x[2]==0.) return(2);
return(1);
}
}
int main(){
double a,b,c;
double x[3];
cin>>a>>b>>c;
int d = Cubic(x,a,b,c);
cout<<"Ildizlar soni: "<<d<<endl;
for(int i = 0; i<d; i++){
cout<<"x"<<i+1<<" = "<<x[i]<<endl;
//cout<<x[i]*x[i]*x[i]+a*x[i]*x[i]+b*x[i]+c<<endl;
}
}
Natija:
Amaliyot topshiriqlari:
1.Kvadrat teglama
1. Koeffitsiyentlari a=3, b= -6, c=2 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=5, b=7, c=9 bo’lgan uchburchak yuzi topilsin.
2. Koeffitsiyentlari a=2, b= -5, c=2 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=6, b=8, c=9 bo’lgan uchburchak yuzi topilsin.
3. Koeffitsiyentlari a=-1, b= -6, c=3 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=2, b=9, c=7 bo’lgan uchburchak yuzi topilsin.
4. Koeffitsiyentlari a=2, b= 4, c=-5 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=9, b=8, c=13 bo’lgan uchburchak yuzi topilsin.
5. Koeffitsiyentlari a=1, b=5, c=3 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=5, b=7, c=9 bo’lgan uchburchak yuzi topilsin.
6. Koeffitsiyentlari a=4, b= 6, c=-2 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=8, b=16, c=9 bo’lgan uchburchak yuzi topilsin.
7. Koeffitsiyentlari a=2, b= -7, c=4 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=3, b=4, c=5 bo’lgan uchburchak yuzi topilsin.
8. Koeffitsiyentlari a=4, b= 6, c=1 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=6, b=8, c=10 bo’lgan uchburchak yuzi topilsin.
9. Koeffitsiyentlari a=1, b= 8, c=7 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=12, b=15, c=9 bo’lgan uchburchak yuzi topilsin.
10. Koeffitsiyentlari a=4, b= 10, c=4 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=6, b=7, c=10 bo’lgan uchburchak yuzi topilsin.
11. Koeffitsiyentlari a=3, b= 10, c=3 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=5, b=11, c=9 bo’lgan uchburchak yuzi topilsin.
12. Koeffitsiyentlari a=4, b= -6, c=-4 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=7, b=16, c=10 bo’lgan uchburchak yuzi topilsin.
13. Koeffitsiyentlari a=3, b= -8, c=-3 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=8, b=5, c=9 bo’lgan uchburchak yuzi topilsin.
14. Koeffitsiyentlari a=2, b= -5, c=2 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=7, b=12, c=9 bo’lgan uchburchak yuzi topilsin.
15. Koeffitsiyentlari a=2, b= 5, c=-3 bo’lgan kvadrat tenglama ildizlari topilsin;
Tomonlari a=10, b=10, c=10 bo’lgan uchburchak yuzi topilsin.
2.Kubik tenglama
Quyidagi tenglamalarning yechimlarini toping: