Szukanie miejsca zerowego wielomianu w podanym przedziale.

0

Witam, zrobiłem program służący do tego co w temacie, ale nie działa on na pewnych danych i nie wiem dlaczego.
Oto kod:

#include <iostream>
#include <vector>
#include <cmath>
double funk(double x)
{return 2*pow(x,2)+3*x-5;
}
using namespace std;
int main ()
{
double ylewa,yprawa,x,p,q,s;

p=-1;
q=2;
int D=0;
ylewa=funk(p);
yprawa=funk(q);

if ((ylewa*yprawa)>0)
{cout<<"NIE"<<endl;
 return 0;
}
else 
{while ((q-p)>0 || D<100000)
   {D++;
     s=(p+q)/2;    
    if(funk(s)==0)
    { cout<<s<<endl;system("pause"); return 0; }
  else
    if (funk(p)* funk(s)<0) q=s;
     else
       p=s;
}
}

system("pause");
 return 0;
}

program wyszukuje miejsce zerowe wielomianu z podanego zakresu p=-1, q=2.
No i działa, ale kiedy zmieniam wzór funkcji na 2pow(x,3)-pow(x,2)+3x-14 i podaje p=0,q=3. To liczy i liczy, a sprawdzałem nawet i nie wiem dlaczego tak jest, w pętli while zmienna D wzrasta powyżej ograniczenie.
Możliwe, że wielomian nie ma miejsca zerowego, ale niestety nie wiem jak to uwzględnić w kodzie.
Za pomoc z góry dziękuję.

1

&& D<100000)

1

Tutaj jest błąd: if(funk(s)==0). Porównywanie liczby zmiennoprzecinkowej z zerem jest zazwyczaj niemądre. Powinieneś liczyć tak długo, aż znaleziona liczba (miejsce zerowe) będzie wystarczająco blisko zera.

1

Najlepiej wcale nie sprawdzać if(funk(s)==0) ani też nie sprawdzać ilość kroków tylko:

double ys;
while((s=(p+q)/2)>p && (s<q)) if(ylewa*(ys=funk(s))<0) q=s; else { p=s; ylewa=ys; }
cout<<s<<endl;
0

Zrobiłem i chyba jest dobrze :) Oto kod:

#include <iostream>
#include <vector>
#include <cmath>
double funk(double x)
{return 2*pow(x,3)-pow(x,2)+3*x-14;
}
using namespace std;
int main ()
{
double ylewa,yprawa,x,p,q,s;

p=0;
q=3;
int D=0;
ylewa=funk(p);
yprawa=funk(q);

if ((ylewa*yprawa)>0)
{
 cout<<"NIE"<<endl;
 system("pause");
 return 0;
}
 else 
 { 
  while((q-p)>0 && D<10000) 
  { 
   D++;
   s=(p+q)/2;
     if(funk(s)==0)
     {
      cout<<s<<endl;system("pause"); return 0; 
     }
   if(funk(p)*funk(s)<0) q=s; 
   else p=s;
   }
  cout<<s<<endl;
   }
system("pause");
 return 0;
}

wynik 1.8093 sądzę że taki powinien być. Trochę pozmieniałem Wasze propozycje. Dzięki za pomoc.

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