[C++] Styczna wyznaczanie miejsc zerowych

ptasiek123
Użytkownik
Użytkownik
Posty: 44
Rejestracja: 2 mar 2010, o 19:39
Płeć: Mężczyzna
Lokalizacja: Zabrze
Podziękował: 3 razy
Pomógł: 1 raz

[C++] Styczna wyznaczanie miejsc zerowych

Post autor: ptasiek123 »

Napisac program który metodą newtona wyznaczy z zadaną dokladnoscia \(\displaystyle{ d =10 ^{-6}}\) miejsca zerowe funkcji \(\displaystyle{ f(x)=x-exp(-x)}\) w przedziale który zarzadamy

w 4 punkcie jest wzor
\(\displaystyle{ x _{k+1}=x _{k}- \frac{f(x _{k}) }{f'(x _{k})}}\)

f'(x) pochodna f(x)

Kod: Zaznacz cały

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

float lukasz(float x)
{
      float y;
      y=x-exp(-x);
            return y;
}
float pochodna (float x)
      {
      float y;
      y=1+exp(-x);
      return y;
}

int main(void)
{
float d;
int b;
float x,a;
cout<<"Podaj przedzialy w ktorych chcesz szukac miejsc zerowych: ";
cin>>a;
cin>>b;
d=1/1000000;
cout<<setw(10)<<fixed<<"y";
cout<<setw(10)<<fixed<<"x"<<endl;

if(lukasz(a)*lukasz(b)<0)
                         x=a;
                         do {
                         if ((fabs(lukasz(x)))>d) {

                         x=x-lukasz(x)/(pochodna(x));
cout<<setw(10)<<lukasz(a);
cout<<setw(10)<<a<<endl;
}}
while(fabs(lukasz(x))<d);



system ("pause");
return 0;
}
to moj kod i cos mi nie wychodzi
Ostatnio zmieniony 17 lis 2011, o 19:56 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] Styczna wyznaczanie miejsc zerowych

Post autor: wawek91 »

Coś nie wychodzi, ale co? Wynik jest błędny? Nie kompiluje się? Czy jeszcze jakiś inny problem? Wrócę z zajęć to przeanalizuje kod. Btw na przyszłość swój kod dawaj w znaczniki [ code ] [ /code ]

Edit:
Tak jak obiecałem:

Kod: Zaznacz cały

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
 
double lukasz(double x)
{
      double y;
      y=x-exp(-x);
      return y;
}
double pochodna (double x)
{
      double y;
      y=1+exp(-x);
      return y;
}
 
int main(void)
{
double d, x, a, b;
cout<<"Podaj przedzialy w ktorych chcesz szukac miejsc zerowych: ";
cin >> a >>  b;
d=1/1000000;
cout<<setw(10)<<fixed<<"y";
cout<<setw(10)<<fixed<<"x"<<endl;
 
if(lukasz(a)*lukasz(b)<0)
   x=a;
else
{
   cout << "podales bledny przedzial" << endl;
   return 0;
}
do 
{
  if ((fabs(lukasz(x)))>d) 
      x=x-lukasz(x)/pochodna(x);
}while(fabs(lukasz(x))<d);
 
cout << x << " " << lukasz(x) << endl;
 
return 0;
}
Tylko nie zdziw się, że jeśli podasz a = -1 b = 1 otrzymasz zupełnie co innego niż dla a = 1 b = -1. Jest tak dlatego, że należy jeszcze zwrócić uwagę na warunek, że punktem startowym będzie ten kraniec przedziału gdzie druga pochodna ma taki sam znak co wartość w tym punkcie, a nie jest to uwzględnione w Twoim algorytmie.
ODPOWIEDZ