Fan nomi: Algoritmlarni Loyihalash Fakultet


Kubik tenglama ildizlarini aniqlash


Download 55.25 Kb.
bet2/2
Sana18.06.2023
Hajmi55.25 Kb.
#1591554
1   2
Bog'liq
1-amaliyot

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 R2t=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:

(agar tenglama koeffitsientlari bu ko’rinishda bo’lmasa shu holatga keltiriladi)
#include /* for sqrt(), fabs(), pow(), cos(), acos(). */
#include
//#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(r2double 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: "< for(int i = 0; i cout<<"x"< //cout< }
}
Natija:




#include


using namespace std;
int main()
{
double a, b, c; cin>>a>>b>>c;
if(a==0 && b==0 && c==0) {
cout<<-1;
return 0;
}
if(a==0 && b==0 && c!=0){
cout<<0;
return 0;
}
if(a==0){
double x=-1.0*c/b;
cout<<1<printf("%.6f", x);
return 0;
}
double d=b*b-4.0*a*c;
if(d<0) cout<<0;
if(d==0) {
double x=-0.5*b/a;
cout<<1<printf("%.6f", x);
}
if(d>0){
cout<<2<double x1=0.5*(-b+sqrt(d))/a,
x2=0.5*(-b-sqrt(d))/a;
printf("%.6f\n%.6f", x2, x1); }
}

Download 55.25 Kb.

Do'stlaringiz bilan baham:
1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling