[C++] Rozwiązanie równanie nieliniowego metodą siecznych
-
- 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
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....
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.
Powód: Poprawa wiadomości. Taguj tematy.
[C++] Rozwiązanie równanie nieliniowego metodą siecznych
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);
...
-
- 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
Czy powyższy fragment mogę zastosować do metody bisekcji aby pominać na razie zabawę z rekurencją jaka wystepuje w tej metodzie?
[C++] Rozwiązanie równanie nieliniowego metodą siecznych
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?
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?
-
- 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
Metodę bisekcji napisałem tak ( działa ale nie dla tego równania )
Teraz trzeba to zmodyfkować właśnie w twój sposób...
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;
}
[C++] Rozwiązanie równanie nieliniowego metodą siecznych
naj sam przód to trzeba sobie kupić wrotki
"troszkę" poprawiłem Twój kod
"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.
-
- 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
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ć
double a=szukaj(-1, 0);
double b=szukaj(0, 2);
Teraz pewnie tą funkcję szukaj trzeba jakoś rozpisać
[C++] Rozwiązanie równanie nieliniowego metodą siecznych
pewnie tak
uwaga, pisane na kolanie
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; }
-
- 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
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;
}
-
- 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
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;}
Pozdrawiam i życzę wszystkim wesołych świąt i dużo dużo wiedzy, którą próbuję zdobyć!