C++ 弦截法 有些疑问求解答

弦截法中,函数各种嵌套调用,例题中所给的一元三次方程是给定的,系数定好的,那么假如我希望一元三次方程的系数是由自己输入的,但调用的函数不是不能存的么,写在主函数里,那后面的 f 函数好像也用不到了,假如 f 函数再调用一个“定系数的函数”,总不能每次计算都输入一次吧。。。

 #include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

double f(double);
double xpoint(double,double);
double root(double,double);

int main(){
double x1,x2,f1,f2,x;
do{
cout<<"input x1,x2:";
cin>>x1>>x2;
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
cout<<setiosflags(ios::fixed)<<setprecision(7);
cout<<"A root of equation is"<<x<<endl;
return 0;
}

double f(double x){             //这里能输入么,或者再调用一个函数。
double y;
y=x*x*x-5*x*x+16*x-80;
return y;
}

double xpoint(double x1,double x2){
double y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return y;
}

double root(double x1,double x2){
double x,y,y1;
y1=f(x1);
do{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0){
y1=y;
x1=x;
}
else
x2=x;
}while(fabs(y)>=0.0000001);
return x;
}

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

在使用弦截法求解方程时,函数的嵌套调用是为了在每次迭代中获取函数在不同点上的函数值。如果你希望一元三次方程的系数由用户输入,你可以在主函数中读取系数,并将它们作为参数传递给函数。


以下是修改后的代码示例:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

double f(double, double, double, double, double);
double xpoint(double, double, double, double, double);
double root(double, double, double, double, double);

int main() {
    double a, b, c, d, x1, x2, f1, f2, x;
    
    cout << "Enter the coefficients (a, b, c, d) of the cubic equation: ";
    cin >> a >> b >> c >> d;
    
    do {
        cout << "Input x1, x2: ";
        cin >> x1 >> x2;
        f1 = f(a, b, c, d, x1);
        f2 = f(a, b, c, d, x2);
    } while (f1 * f2 >= 0);
    
    x = root(a, b, c, d, x1, x2);
    
    cout << setiosflags(ios::fixed) << setprecision(7);
    cout << "A root of the equation is " << x << endl;
    
    return 0;
}

double f(double a, double b, double c, double d, double x) {
    double y = a * pow(x, 3) + b * pow(x, 2) + c * x + d;
    return y;
}

double xpoint(double a, double b, double c, double d, double x1, double x2) {
    double y = (x1 * f(a, b, c, d, x2) - x2 * f(a, b, c, d, x1)) / (f(a, b, c, d, x2) - f(a, b, c, d, x1));
    return y;
}

double root(double a, double b, double c, double d, double x1, double x2) {
    double x, y, y1;
    y1 = f(a, b, c, d, x1);
    
    do {
        x = xpoint(a, b, c, d, x1, x2);
        y = f(a, b, c, d, x);
        
        if (y * y1 > 0) {
            y1 = y;
            x1 = x;
        } else {
            x2 = x;
        }
    } while (fabs(y) >= 0.0000001);
    
    return x;
}

在上述修改后的代码中,你可以输入一元三次方程的系数,然后将这些系数作为参数传递给函数。这样,在每次函数调用时,都会使用输入的系数进行计算。这样你就可以实现自己输入系数的功能,并进行弦截法的求解。