Моя программа, которую я написал, чтобы найти корни уравнения, почти закончена, но я столкнулся с небольшой проблемой. Вложенный цикл, который я использую, чтобы назначить переменные значения скорости и угла в уравнениях, не работает. Где-то либо в цикле, либо в вызове секьюры fx есть ошибка, которую я пропускаю. Он продолжает давать мне одинаковые числа для корня, количества итераций и f (x). Если бы кто-нибудь мог помочь мне найти мою ошибку, я был бы очень признателен:)
#include<iostream>
#include<cmath>
#include<iomanip>
#include<fstream>
using namespace std;
// 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);
}
}
system("pause");
}
// 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;
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;
}
// Defines "fx"
double fx(double radians,double velocity, double kr, double uc, double q, double b, double ts)
{
return kr * pow(ts,4.0) + uc * ts - q - pow(velocity / b, 2.0) * sin(radians);
}