why x works but is undeclared? c++
One of the example problems i am basing a program off of for secant root finding uses x, but doesn't declare it, but runs successfully. Meanwhile when i use the nearly the same setup i get an error saying x is undeclared. Why does it work in the example program and not mine?
using namespace std;
#include<iostream>
#include<cmath>
#include<iomanip>
// Declaration of functions used
void secant(double, double, double, double,
double, double, double&, int& );
double fx(double, double, double, double, double);
const double tol=0.0001; // Tolerance for convergence
const int max_iter=50; // Maximum iterations allowed
// main program
int main()
{
int iteration; // Number of iterations
double a, b, c, d; // Constants in f(x)
double x0, x1; // Starting values for x
double root; // Root found by secant method
cout<<"Enter a, b, c, and d"<<endl<<"separated by a space ";
cin>>a>>b>>c>>d;
cout<<"\nEnter two initial values for x,\nseparated by a space: ";
cin>>x0>>x1;
secant(a, b, c, d, x0, x1, root, iteration);// Call "secant"
// Output
cout<<"\nThe root is = "<<root<<endl;
cout<<"The number of iterations was = "<<iteration<<endl;
cout<<"The value of f(x) at the root = "<<fx(a,b,c,d,root)<<endl<<endl;
system("pause");
return 0;
}
// Definition of function "secant"
// Receives a, b, c, d and x0 values from main program
// Returns root and the iterations required
void secant(double a,double b, double c, double d,
double x0, double x1, double& root, int& iteration)
{
double xnminus1, xnplus1, xn; // Local variables
iteration=0; // Initialize iterations
xnminus1=x0;
xn=x1;
do
{
++iteration;
xnplus1 = xn - fx(a,b,c,d,xn)*(xn-xnminus1)/
(fx(a,b,c,d,xn)-fx(a,b,c,d,xnminus1));
cout<<"x"<<iteration+1<<" = "<<xnplus1<<endl;
xnminus1 = xn;
xn=xnplus1;
}
while ((fabs(fx(a,b,c,d,xnplus1)) >= tol )&& (iteration < max_iter));
root=xnplus1;
}
// Defines "fx" -- calculates f(x) = ax^3+bx^2+cx+d
double fx(double a, double b, double c, double d, double x)
{
return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
here is my program which i used the same structure but it is saying x is undeclared?
using namespace std;
#include<iostream>
#includ开发者_JS百科e<cmath>
#include<iomanip>
#include<fstream>
// Declaration of functions used
void secant(double, double, double, double,
double, double, double, double, double&, int& );
double fx( double, double, double, double, double, double, double);
const double tol=0.0001; // Tolerance for convergence
const int max_iter=50; // Maximum iterations allowed
// main program
int main()
{
int iteration; // Number of iterations
double kr, uc, q, b, radians;
double x0, x1; // Starting values for x
double root; // Root found by secant method
const double PI = 4.0*atan(1.0);
ifstream datain ("shuttle.txt");
ofstream dataout ("results.txt");
datain >> kr >> uc >> q >> b;
int velocity = 16000;
double angle =10;
x0= 1000;
x1 = 200;
for (int velocity = 16000; velocity <= 17500; velocity += 500) {
for (int angle = 10; angle <= 70; angle += 15) {
radians= angle * PI/180 ;
cout << velocity << endl;
cout << radians << endl;
cout << angle << endl;
secant (radians, velocity, kr, uc, q, b, x0, x1, root, iteration);
// Output
cout<<"\nThe root is = "<<root<<endl;
cout<<"The number of iterations was = "<<iteration<<endl;
cout<<"The value of f(x) at the root = "<<fx(radians, velocity, kr, uc, q, b, root)<<endl<<endl;
system("pause");
return 0;
}
// Definition of function "secant"
// Receives a, b, c, d and x0 values from main program
// Returns root and the iterations required
void secant(double radians,double velocity, double kr, double uc, double q, double b, double x0, double x1, double& root, int& iteration);
{
double xnminus1, xnplus1, xn; // Local variables
iteration=0; // Initialize iterations
xnminus1=x0;
xn=x1;
do
{
++iteration;
xnplus1 = xn - fx(radians, velocity, kr, uc, q, b, xn)*(xn-xnminus1)/
(fx(radians, velocity, kr, uc, q, b, xn)-fx(radians, velocity, kr, uc, q, b, xnminus1));
cout<<"x"<<iteration+1<<" = "<<xnplus1<<endl;
xnminus1 = xn;
xn=xnplus1;
}
while ((fabs(fx(radians, velocity, kr, uc, q, b, xnplus1)) >= tol )&& (iteration < max_iter));
root=xnplus1;
}
// Defines "fx" -- calculates f(x) = ax^3+bx^2+cx+d
double fx(double radians,double velocity, double kr, double uc, double q, double b, double x);
{
return kr * pow(x,4.0) + uc * x - q - pow(velocity/b, 2.0) * sin(radians);
}}
}
double fx(double radians,double velocity, double kr, double uc, double q, double b, double x);
you have an extra semicolon ";" at the end of the line. :)
Should be
double fx(double radians,double velocity, double kr, double uc, double q, double b, double x)
You also have the same error when defining the secant function. When you define a function you don't put a semicolon at the end.
Final code should look something like this
#include<iostream>
#include<cmath>
#include<iomanip>
#include<fstream>
// Declaration of functions used
void secant(double, double, double, double, double, double, double, double, double&, int& );
double fx( double, double, double, double, double, double, double);
const double tol=0.0001; // Tolerance for convergence
const int max_iter=50; // Maximum iterations allowed
using namespace std; // <- Goes after including the headers
// main program
int main()
{
int iteration; // Number of iterations
double kr, uc, q, b, radians;
double x0, x1; // Starting values for x
double root; // Root found by secant method
const double PI = 4.0*atan(1.0);
ifstream datain ("shuttle.txt");
ofstream dataout ("results.txt");
datain >> kr >> uc >> q >> b;
int velocity = 16000;
double angle =10;
x0= 1000;
x1 = 200;
for (int velocity = 16000; velocity <= 17500; velocity += 500)
{
for (int angle = 10; angle <= 70; angle += 15)
{
radians= angle * PI/180 ;
cout << velocity << endl;
cout << radians << endl;
cout << angle << endl;
secant (radians, velocity, kr, uc, q, b, x0, x1, root, iteration);
}
}
// Output
cout<<"\nThe root is = "<<root<<endl;
cout<<"The number of iterations was = "<<iteration<<endl;
cout<<"The value of f(x) at the root = "<<fx(radians, velocity, kr, uc, q, b, root)<<endl<<endl;
system("pause");
return 0;
}
// Definition of function "secant"
// Receives a, b, c, d and x0 values from main program
// Returns root and the iterations required
void secant(double radians,double velocity, double kr, double uc, double q, double b, double x0, double x1, double& root, int& iteration)
{
double xnminus1, xnplus1, xn; // Local variables
iteration=0; // Initialize iterations
xnminus1=x0;
xn=x1;
do
{
++iteration;
xnplus1 = xn - fx(radians, velocity, kr, uc, q, b, xn)*(xn-xnminus1)/
(fx(radians, velocity, kr, uc, q, b, xn)-fx(radians, velocity, kr, uc, q, b, xnminus1));
cout<<"x"<<iteration+1<<" = "<<xnplus1<<endl;
xnminus1 = xn;
xn=xnplus1;
}
while ((fabs(fx(radians, velocity, kr, uc, q, b, xnplus1)) >= tol )&& (iteration < max_iter));
root=xnplus1;
}
// Defines "fx" -- calculates f(x) = ax^3+bx^2+cx+d
double fx(double radians,double velocity, double kr, double uc, double q, double b, double x)
{
return kr * pow(x,4.0) + uc * x - q - pow(velocity/b, 2.0) * sin(radians);
}
I'll assume you mean the x
variable in the function fx
:
x
is declared as a parameter, hence why it can be used without an explicit local variable declaration. what might be throwing you off is the forward declaration of fx
hasn't got names for its args
精彩评论