[C++] Rozwiązanie równanie nieliniowego metodą siecznych

józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

Witam

Mam napisać program który realizuje metodę siecznych takie równanie:

\(\displaystyle{ f(x)=\frac{1}{x}-2^x}\)

w przedziale \(\displaystyle{ x \in\left\langle -1;2 \right\rangle}\)

Wiem, że ten przedział trzeba podzielić na dwa:

\(\displaystyle{ \left\langle -1;0 \right) \cup \left( 0;2 \right\rangle}\)

Nie wiem jak nadać wartości czyli początek a i koniec b....
Ostatnio zmieniony 10 gru 2011, o 14:57 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości. Taguj tematy.
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

Kod: Zaznacz cały

double f(double x){
        x= 1/x-exp(x*log(2));
        if     ( x >  1e10 ) return  1e10;
        else if( x < -1e10 ) return -1e10;
        return x;}

double szukaj(double a, double b);

main(){
        double x1=szukaj(-1, 0), x2=szukaj(0,2);
        ...
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

Czy powyższy fragment mogę zastosować do metody bisekcji aby pominać na razie zabawę z rekurencją jaka wystepuje w tej metodzie?
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

to działa, choć nie podoba mi się, działa nawet gdy limit zawęzić do +/- 1
w szukaj może pojawić się while( fabs(f(x)) > eps ), oczywiście ten limit musi być większy od eps.
w bisekcji czuję, że działać musi, ale okazuje się, że dla siecznych też jest ok.
a o jaką rekurencję chodzi?
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

Metodę bisekcji napisałem tak ( działa ale nie dla tego równania )

Kod: Zaznacz cały

#include <iostream.h>
#include <conio.h>
#include <math.h>

double f(double x) //Deklaracja funkcji
{
       return x*x*x-2*x*x-4*x-7;
}

int main(void)
{
    
    cout<<"Metoda Biskecji by ........."<<endl;
    double a=3; //Początek przedziału;
    double b=4; //Koniec przedziału;
    double c;
    double eps=0.00001;
    if(f(a)*f(b)>=0) cout<<"Funkcja nie spelnia zalozen!"<<endl;
    {
    do
    {
                   
                   c=(a+b)/2;
                   if(f(a)*f(c)<0)
                   {
                                  if(a>c)
                                  {
                                  
                                         a=c;
                                         b=a;
                                  }
                                  
                                  if(a<c)
                                  {
                                  
                                  a=a;
                                  b=c;
                                  
                                  }
                                  
                   
                         c=(a+b)/2;         
                   }
                   
                   if(f(b)*f(c)<0)
                   {
                                  if(b>c)
                                  {
                                         a=c;
                                         b=b;
                                  }
                                  
                                 
                                 if(b<c)
                                  {
                                  a=b;
                                  b=c;
                                  }
                                  
                   
                     c=(a+b)/2;             
                   }
                   
                   
                   
                   
                   
    }while(f(c)>eps);
}

    cout<<"Nasz pierwiastek to: "<<c<<endl;
    getch();
    return 0;

}

    
    
Teraz trzeba to zmodyfkować właśnie w twój sposób...
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

naj sam przód to trzeba sobie kupić wrotki
"troszkę" poprawiłem Twój kod

Kod: Zaznacz cały

#include <iostream>  // poprawka
using namespace std; // brakowało 
#include <cstdio>    //brakował
//#include <conio.h> // kula u nogi
#include <cmath>     //poprawka

double f(double x){
	return ((x - 2)*x - 4)*x - 7; } // poprawka 2 mnożenia zamiast 5 (może 4), detal ale...
	//return x*x*x-2*x*x-4*x-7;}

inline int sgn(double x){ 
	return (x > 0) - (x < 0); } // -1 gdy x<0, 1 gdy x>0, 0 gdy x==0
	
int main(void){
	cout<<"Metoda Biskecji by ........."<<endl;
	double a= 3;
	double b= 4;
	double c;
	double eps= 0.00001;
	if( sgn(f(a)) == sgn(f(b)) )  // poprawka 
		cout << "Funkcja nie spelnia zalozen!" << endl; 
	else {   // brakowało ELSE
		do { // zawsze trzy razy liczone f(), a wystarczy raz, do poprawienia
                               // choć może kompilator to poprawi
			c= (a + b)/2; // a dalej, no cóż...
			if( sgn(f(a)) != sgn(f(c)) )  // jeden z końcy może być zerem
				b= c;
			else
				a= c; 
		}while( fabs(f(c)) > eps ); // brakowało fabs
	}
	c= (a + b)/2; // poprawi nieco wynik
	cout << "Nasz pierwiastek to: " << c << endl;
	while ( 1 > getchar() ); // tak jakoś ładniej 
	return 0;	
}
Ostatnio zmieniony 10 gru 2011, o 11:55 przez Xitami, łącznie zmieniany 1 raz.
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

W porządku więc teraz posiłkujmy się kodem zredagowanym przez Ciebie . Nie jestem programistą więc nadal nie wiem jak wklepać tutaj odpowiednie przedziały dla funkcji, która stwarza mi niemały problem. U Ciebie funkcja "szukaj" przyjmuje dwa parametry, początek i koniec przedziału. Rozumiem jak na razie. No potem mamy:

double a=szukaj(-1, 0);
double b=szukaj(0, 2);

Teraz pewnie tą funkcję szukaj trzeba jakoś rozpisać
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

pewnie tak

Kod: Zaznacz cały

double szukaj(double a, double b){
   do{
      double c= b - f(b)*(b - a)/(f(b) - f(a));
      a=b; b=c;
   } while( fabs(f(b)) > eps );
   return b; }
uwaga, pisane na kolanie
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

No niestety nadal dzieli przez 0....
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

a pokaż co masz
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

Kod: Zaznacz cały

#include <iostream>  // poprawka
using namespace std; // brakowało
#include <cstdio>    //brakował
#include <conio.h> // kula u nogi
#include <cmath>     //poprawka

double f(double x){
   return (1/x)-pow(2,x);} // poprawka 2 mnożenia zamiast 5 (może 4), detal ale...
   //return x*x*x-2*x*x-4*x-7;}

inline int sgn(double x){
   return (x > 0) - (x < 0); } // -1 gdy x<0, 1 gdy x>0, 0 gdy x==0
   double szukaj(double a, double b){
   do{
      double c= b - f(b)*(b - a)/(f(b) - f(a));
      a=b; b=c;
   } while( fabs(f(b)) > 0.0001 );
   return b; }
   
int main(void){
   cout<<"Metoda siecznych ........."<<endl;
   double a= szukaj(-1, 0);
   double b= szukaj(0, 2);
   double c;
   cout<<""<<b<<endl;
 getch();
   return 0;   
}
Xitami

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: Xitami »

275843.htm#p4834796
józef92
Użytkownik
Użytkownik
Posty: 660
Rejestracja: 13 gru 2008, o 21:01
Płeć: Mężczyzna
Lokalizacja: Bolesławiec
Podziękował: 263 razy
Pomógł: 3 razy

[C++] Rozwiązanie równanie nieliniowego metodą siecznych

Post autor: józef92 »

Kod: Zaznacz cały

double f(double x){
        x= 1/x-exp(x*log(2));
        if     ( x >  1e10 ) return  1e10;
        else if( x < -1e10 ) return -1e10;
        return x;}
Możesz mi wytłumaczyć ten kawałek kodu??

Pozdrawiam i życzę wszystkim wesołych świąt i dużo dużo wiedzy, którą próbuję zdobyć!
ODPOWIEDZ