Не буду я много писать про этот метод, потому что он во-первых прост, а во-вторых очень популярен. К тому же в википедии есть уже готовый код. Но у меня другой код!! Первое различие между моим кодом и кодом в вики в том, что в википедии итерационная формула записана не канонически, так сказать...Во-вторых мой код работает для бОльших промежутков. Во всяком случае с тем уравнением, которое у меня записано. И третье различие в том, что здесь имеется проверка на концы отрезка. За каким фигом она нужна...Да хрен её знает (: Я так и не понял. Препод сказал что нужна. Не буду же я спорить! В общем вот - пользуйтесь, если кому надо:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;
long double F(long double x)
{
return sin(x/2)-exp(pow(x,2))+exp(x)+x+1;
}
int main()
{
cout << "Найти положительный корень уравнения sin(x/2)-exp(pow(x,2))+exp(x)+x+1=0 методом хорд: " << endl;
int it=0;
long double a=1, b=6;
cout << "Начальное приближение: A=" << a << ", B=" << b << endl;
cout << "=============" << endl;
long double Xi1=0, Xi=b, Xim1=a;
while(1)
{
long double xpr=Xi1;
Xi1=(-F(Xim1)*(Xi-Xim1)) / (F(Xi)-F(Xim1))+Xim1;
if (F(Xim1)*F(xpr)>0) {
Xi=Xi1; //b
Xim1=Xim1; //a
} else {
Xi=Xi; //b
Xim1=Xi1; //a
}
it++;
cout << "Значение X на итерации " << it << ": "<< Xi << endl;
if (fabs(Xi1-xpr)<0.0001) break;
}
cout << "=============";
cout << endl <<"Всего итераций: " << it << endl;
cout << "Положительный корень уравнения: " << Xi << ", с точностью 0.0001" << endl;
return 0;
}
Комментариев нет :
Отправить комментарий