Algebraik va transtsendent tenglamalarni taqribiy echish usullari


Download 129.76 Kb.
bet3/5
Sana08.06.2023
Hajmi129.76 Kb.
#1463179
1   2   3   4   5
2. URINMALAR (NYUTON) USULI

Urinmalar usulini N’yuton usuli deb ham ataydilar. Bu usulni ham ikki xolat uchun kurib chiqamiz.


1- xolat. Faraz kilaylik, f(a) < 0, f(b) > 0, f'(x) > 0, f''(x) > 0 yoki f(a)>0, f(b) < 0, f'(x) < 0, f''(x) < 0 (7-rasm).

7- racm 8 - racm




y = f(x) egri chiziqka V nuqtada urinma o’tkazamiz va urinmaning Ox uki bilan kesishgan nuqtasi x1ni aniqlaymiz.
Urinmaning tenglamasi quyidagicha:
y - f(b) = f'(b) (x-b), (2.12)
bu erda y=0, x=x1 deb , (2.12) ni x1 nisbatan echsak,
(2.13)
Shu muloxazani [a;x1] kesma uchun takrorlab, x2 ni topamiz:
(2.14)
Umuman olganda
(2.15)
Hisoblashni |xn+1 - xn| £ e shart bajarilganda tuxtatamiz.
2- xolat. Faraz kilaylik f(a) < 0, f(b) > 0, f'(x) > 0, f''(x) < 0 yoki f(a)>0, f(b) < 0, f'(x) < 0, f''(x) > 0 (8- rasm). y = f(x) egri chiziqka A nuqtada urinma o’tkazamiz, uning tenglamasi:
y - f(a) = f' (a) (x – a), (2.16)
Bu erda y=0, x=x1 decak,
(2.17)
[x1;b] kesmadan
(2.18)
Umuman
(2.19)
(2.13) va (2.17) formulalarni bir-biri bilan solishtirsak, ular bir-birlaridan boshlangich yaqinlashishi (a yoki b) ni tanlab olish bilan farqlanadilar. Boshlangich yaqinlashishni tanlab olishda quyidagi koidadan fondalaniladi; boshlangich yaqinlashish tarzida [a;b] kesmaning shunday chekka (a yoki b) qiymatini olish kerakki, bu nuqtada funktsiyaning ishorasi uning ikkinchi hosilasining ishorasi bilan bir xil bo`lsin.


Misol. x-sinx=0,25 tenglamaning ildizi e=0,0001 aniqlikda urinmalar usuli bilan aniqlansin.
Echish. Tenglamaning ildizi [0,982; 1,178] kesmada ajratilgan (buni tekshirishni kitobxonga xavola kilamiz); bu erda a=0,982; b=1,178;
f'(x)=1-cosx; f''(x) = sin x>0.
[0,982; 1,178] kesmada f(1,178) . f''(x) > 0, ya`ni boshlangich yaqinlashishda x0 =1,178. Hisoblashni (2.13)-(2.15) formulalar vositasida bajaramiz. Hisoblash natijalari quyidagi 2.1-jadvalda berilgan.
2.1-jadval

n

xn

- sin xn

f(xn)=xn-sinxn-0,25

f¢(xn)=1-sosxn



0

1,178

- 0,92384

0,00416

0,61723

- 0,0065

1

1,1715

- 0,92133

0,00017

0,61123

- 0,0002

2

1,1713

- 0,92127

0,00003

0,61110

- 0,0005

3

1,17125













J advaldan kurinadiki, x3-x2 = |1,17125 – 1,1713| = 0,00005 < e . Demak echim deb x = 1,17125 ni (e =0,0001 aniqlikda) olish mumkin.


5-8 – rasmlarga dikkat bilan e`tibor kilsak shuni ko`ramizki, f(x)=0 tenglamaning taqribiy echimlarini vatarlar va urinmalar usuli bilan topganda aniq echimga ikki chekkadan yaqinlashib kelinadi. Shuning uchun ikkala usulni bir vaktning o`zida qo`llash natijasida maqsadga tezrok erishish mumkin. Bu usulni kombinatsiyalangan usul deb ataydilar. Kombinatsiyalangan usul yuqorida keltirilgan usullarning umumlashmasi bo`lgani tufayli bu to`g’rida ko`p tuxtalmaymiz.
#include
#include
using namespace std;
int main()
{
int n;
cout << "Enter the number of equations: ";
cin >> n;
double a[n][n+1], x[n];
cout << "Enter the elements of the augmented matrix: " << endl;
for(int i=0; i; i++){
for(int j=0; j+1; j++){
cout << "a[" << i+1 << "][" << j+1 << "]: ";
cin >> a[i][j];}}
for(int i=0; i; i++)
{
for(int j=i+1; j; j++)
{
double f = a[j][i] / a[i][i];
for(int k=i+1; k+1; k++)
{
a[j][k] = a[j][k] - f * a[i][k];
}
}
}

x[n-1] = a[n-1][n] / a[n-1][n-1];


for(int i=n-2; i>=0; i--)
{
double sum = 0;
for(int j=i+1; j; j++)
{
sum += a[i][j] * x[j];
}
x[i] = (a[i][n] - sum) / a[i][i];
}
cout << "The solution is:" << endl;
for(int i=0; i; i++)
{
cout << "x[" << i+1 << "]: " << x[i] << endl;
}
return 0;
}
Bu dastur yordamida paskalda Gauss usuli yordamida ma'lumotlarni kiritib uni hal qilishimiz mumkin.

Oddiy takrorlash usuli


Oddiy takrorlash usuli Zaydel usulidan biroz farq qiladi. Bu erda o'zgaruvchilarning ikkita vektori mavjud: oldingi X0 qiymatlari va X1 ning keyingi qiymatlari bilan. Har bir iteratsiya oxirida qiymatlar keyingisidan oldingisiga qayta tayinlanadi:
#include
#include

double f(double x) { // funksiya


return pow(x, 3) - 2*x - 5;
}
double g(double x) { // yana funksiya, uni oddiy takrorlash usuli bilan ishlatamiz
return pow(2*x + 5, (double)1/3);
}
int main() {
double x0 = 1; // boshlang'ich qiymat
double x1 = g(x0); // keyingi qiymat
double eps = 0.0001; // epsilon, masofa
int i = 0; // iteratsiya soni
while (fabs(x1 - x0) > eps) {
x0 = x1;
x1 = g(x0);
std::cout << "Iteratsiya #" << ++i << ": x0=" << x0 << ", x1=" << x1 << ", |x1-x0|=" << fabs(x1 - x0) << std::endl;
}
std::cout << "Natija: " << x1 << std::endl; // natijani chiqaramiz
return 0;
}



Download 129.76 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




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