Wyznaczanie miejsca zerowego metodą połowienia

0

witam,
W jaki sposób dodać argument wyświetlający że "funkcja nie zawiera miejsca zerowego"?
po wpisaniu nie właściwego przedziału program wyświetla najwyższą liczbę zadanego przedziału.
prosił bym o poradę.
z góry dziękuję.
pozdrawiam.

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

double f(double x)
{
	//rozpatrujemy wielomian f(x) = x^2-4
	return x*x-4; //rozbijam schematem Hornera
}

double polowienie_przedzialow(double a, double b, double epsilon)
{
	if(f(a)==0.0)return a;
	if(f(b)==0.0)return b;
	
	double srodek;
	
	while(b-a > epsilon) 
	{
		srodek = (a+b)/2;
	
		if(f(srodek) == 0.0)   //jesli miejsce zerowe jest w srodku 
			return srodek;
		
		if(f(a)*f(srodek)<0) 
			b = srodek;
		else
			a = srodek; 	
	}	
	return (a+b)/2; 
}

int main()
{
	double a , b, epsilon = 0.00001;
	
	cout<<"Podaj poczatek przedzialu :";
	cin>> a;
	
	cout<<"Podaj koniec przedzialu :";
	cin>> b;

	
	cout<<"Znalezione miejsce zerowe wynosi: ";
	cout<<fixed<<setprecision(5)<<polowienie_przedzialow(a, b, epsilon);
	
	cin.get();
	return 0;
}
0

Jeśli kolejna iteracja przynosi zmianę niewiększą od zadanego epsilona, a wyliczona wartość funkcji jest odległa od zera co do wartości bezwzględnej o więcej niż jakiś inny epsilon to po prostu wypisz, że funkcja nie ma miejsca zerowego.

0
kapojot napisał(a):

Jeśli kolejna iteracja przynosi zmianę niewiększą od zadanego epsilona, a wyliczona wartość funkcji jest odległa od zera co do wartości bezwzględnej o więcej niż jakiś inny epsilon to po prostu wypisz, że funkcja nie ma miejsca zerowego.

To co napisałeś to dla mnie jakaś czarna magia da się to przedstawić w prostszy sposób :)

0

Imho w Twoim kodzie wystarczyłoby zmienić tylko:

#include <iostream>
#include<iostream>
#include<iomanip>
#include <cmath>
using namespace std;
 
double f(double x)
{
    //rozpatrujemy wielomian f(x) = x^2-4
    return x*x-4; //rozbijam schematem Hornera
}
 
double
polowienie_przedzialow(double a, double b, double epsilon)
{
    double srodek;
    if (f(a) == 0.0)
	    return a;
    if (f(b) == 0.0)
	    return b;
 
    if (f(a) * f(b) > 0) {
	    return (NAN);
    }
 
    while(b - a > epsilon) {
        srodek = (a + b) / 2.0;
 
        if (fabs(f(srodek)) < epsilon)   //jesli miejsce zerowe jest w srodku 
            return srodek;
 
        if (f(a)*f(srodek) < 0) 
            b = srodek;
        else
            a = srodek;     
    }   
    return (NAN);
}
 
int main()
{
    double a , b, epsilon = 0.00001;
 
    cout<<"Podaj poczatek przedzialu :";
    cin>> a;
 
    cout<<"Podaj koniec przedzialu :";
    cin>> b;

    double result;
    result = polowienie_przedzialow(a, b, epsilon);
    if (isnan(result))
	    cout << "Brak miejsca zerowego";
    else {
        cout<<"Znalezione miejsce zerowe wynosi: ";
        cout<<fixed<<setprecision(5)<<result;
    }
 
    cin.get();
    return 0;
}
0
kapojot napisał(a):

Imho w Twoim kodzie wystarczyłoby zmienić tylko:

#include <iostream>
#include<iostream>
#include<iomanip>
#include <cmath>
using namespace std;
 
double f(double x)
{
    //rozpatrujemy wielomian f(x) = x^2-4
    return x*x-4; //rozbijam schematem Hornera
}
 
double
polowienie_przedzialow(double a, double b, double epsilon)
{
    double srodek;
    if (f(a) == 0.0)
	    return a;
    if (f(b) == 0.0)
	    return b;
 
    if (f(a) * f(b) > 0) {
	    return (NAN);
    }
 
    while(b - a > epsilon) {
        srodek = (a + b) / 2.0;
 
        if (fabs(f(srodek)) < epsilon)   //jesli miejsce zerowe jest w srodku 
            return srodek;
 
        if (f(a)*f(srodek) < 0) 
            b = srodek;
        else
            a = srodek;     
    }   
    return (NAN);
}
 
int main()
{
    double a , b, epsilon = 0.00001;
 
    cout<<"Podaj poczatek przedzialu :";
    cin>> a;
 
    cout<<"Podaj koniec przedzialu :";
    cin>> b;

    double result;
    result = polowienie_przedzialow(a, b, epsilon);
    if (isnan(result))
	    cout << "Brak miejsca zerowego";
    else {
        cout<<"Znalezione miejsce zerowe wynosi: ";
        cout<<fixed<<setprecision(5)<<result;
    }
 
    cin.get();
    return 0;
}

Dziękuję bardzo. Sam do tego nigdy bym nie doszedł :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1