- Κώδικας: Επιλογή όλων
#include <iostream.h>
#include <math.h>
void main(){
void Newton2d(double x0, double y0, int max_loops, double tol);
Newton2d( 13,14,100,pow(10,-6) );
}
inline double f(double x,double y) {
double sin(double);
return 1-x-y*sin(3.14159*x/2);
}
inline double f_x(double x,double y){
double cos(double);
return -1-y*cos(3.14159*x/2)*3.14159/2;
}
inline double f_y(double x,double y){
double sin(double);
return -sin(3.14159*x/2);
}
inline double g(double x,double y){
double exp(double),cos(double);
return exp(-y)+10*cos(3.14159*x)-2;
}
inline double g_x(double x,double y){
double sin(double);
return -31.4159*sin(3.14159*x);
}
inline double g_y(double x,double y){
double exp(double);
return -exp(-y);
}
inline double dbl_abs(double num){
return num>0?num:-num;
}
void Newton2d(double x0, double y0, int max_loops, double tol) {
//Variable Declaration
double f(double,double),g(double,double),
f_x(double,double),g_x(double,double),
f_y(double,double),g_y(double,double),
dbl_abs(double),x,y;
int i=1;
//main function
while(i<=max_loops){
x = x0 - ( f(x0,y0)*g_y(x0,y0) - g(x0,y0)*f_y(x0,y0) )/( f_x(x0,y0)*g_y(x0,y0) - g_x(x0,y0)*f_y(x0,y0) );
y = y0 - ( g(x0,y0)*f_x(x0,y0) - f(x0,y0)*g_x(x0,y0) )/( f_x(x0,y0)*g_y(x0,y0) - g_x(x0,y0)*f_y(x0,y0) );
//Test-------------------------------------------------
cout << "Loop "<< i << ":(" << x << "," << y << ").\n";
//-----------------------------------------------------
if( dbl_abs(x-x0) < tol && dbl_abs(y-y0) < tol ){
cout << "The solution is: (" << x <<","<< y <<").\n";
return;
}
++i;
x0=x;
y0=y;
}
cout << "The method has failed after " << max_loops << " loops.\n";
}
Χτυπάει στο 3ο loop (μάλλον στο δεκαδικό μέρος των αριθμών) αν και έχω ορίσει τα πάντα ως double...
Ο αλγόριθμός είναι 100% σωστός, είναι κάποιο τεχνικό πρόβλημα της C++, κάποιο overflow μάλλον...
Εdit: Αγνοήστε τις συναρτήσεις f,g προκύπτουν από την εκφώνηση του προβλήματος και δε δημιουργούν αυτές το πρόβλημα (εξάλλου έχουν πεδίο ορισμού το R).