猪猪虾 发表于 2020-10-24 14:02:25

求方程的近似解,第18行报错,expected primary-expression before float

本帖最后由 猪猪虾 于 2020-10-24 14:03 编辑

用弦截法求方程
f(x)=x3-5x2+16x-80=0 的根

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
        float x1,x2,x,y1,y2,y;
       
        float function(float x);
        float xpoint(float x1,float x2);
        float root(float x1,float x2);
       
        printf("enter the x1:\n") ;
      scanf("%f",&x1);
        printf("enter the x2:\n") ;
        scanf("%f",&x2);
        do
        {
                x = xpoint(float x1,float x2);
                y = abs(float function(float x))
                x1,x2 = float root(float x1,float x2);
        }while(y < (e-6 ));
       
        return 0;
}

//定义直线方程
float function(float x)
{
        float y;
        y = pow(x,3) - 5 * pow(x,2) + 16 * x - 80.0;
        return y;
}

//求两点形成的直线与x轴的交点的横坐标
float xpoint(float x1,float x2)
{
        float function(float x);
        float y1 y2,x,y = 0;
        y1 = float function(float x1);
        y2 = float function(float x2);
        x = ((x1 -x2)/ (y1 -y2)) * (y - y2)+ x2;
        return x;
}

//跟新x1,x2,y1,y2
float root(float x1,float x2)
{
        float xpoint(float x1,float x2);
        float function(float x);
       
        float y,y1,t;
        x = float xpoint(float x1,float x2);
        y1 = float function(float x1);
        y = float function(float x);
        if ((y1 > 0 & y > 0) || (y1 < 0 & y < 0)
        {
                x1 = x;
                y1 = y;
        }
        else
        {
                x2 = x;
                y2 = y;
        }
        return x1,x2;
}

风过无痕1989 发表于 2020-10-24 14:25:35

很多错误,主要是调用函数时无须带参数类型

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
      float x1,x2,x,y1,y2,y;
      
      float function(float x);
      float xpoint(float x1,float x2);
      float root(float x1,float x2);
      
      printf("enter the x1:\n") ;
      scanf("%f",&x1);
      printf("enter the x2:\n") ;
      scanf("%f",&x2);
      do
      {
                x = xpoint(x1,x2);
                y = abs(function(x));
                x1,x2 = root(x1,x2);
      }while(y < 0.000001);
      
      return 0;
}

//定义直线方程
float function(float x)
{
      float y;
      y = pow(x,3) - 5 * pow(x,2) + 16 * x - 80.0;
      return y;
}

//求两点形成的直线与x轴的交点的横坐标
float xpoint(float x1,float x2)
{
      float function(float x);
      float y1,y2,x,y = 0;
      y1 = function(x1);
      y2 = function(x2);
      x = ((x1 -x2)/ (y1 -y2)) * (y - y2)+ x2;
      return x;
}

//跟新x1,x2,y1,y2
float root(float x1,float x2)
{
      float xpoint(float x1,float x2);
      float function(float x);
      
      float x,y,y1,y2,t;
      x = xpoint(x1,x2);
      y1 = function(x1);
      y = function(x);
      if ((y1 > 0 & y > 0) || (y1 < 0 & y < 0))
      {
                x1 = x;
                y1 = y;
      }
      else
      {
                x2 = x;
                y2 = y;
      }
      return x1,x2;
}

风过无痕1989 发表于 2020-10-24 14:28:09

用DEV_C++5.11 TMD-GCC4.9.2 32-bit release 编译通过了,具体的怎么解你的方程,我就不知道了

猪猪虾 发表于 2020-10-24 14:44:57

风过无痕1989 发表于 2020-10-24 14:28
用DEV_C++5.11 TMD-GCC4.9.2 32-bit release 编译通过了,具体的怎么解你的方程,我就不知道了

你再看一眼#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
        float x1,x2,x,y1,y2,y;
       
        float function(float x);
        float xpoint(float x1,float x2);
        float root(float x1,float x2);
        do
        {
                printf("enter the x1:\n") ;
          scanf("%f",&x1);
                printf("enter the x2:\n") ;
                scanf("%f",&x2);
        }while(function(x1) * function(x2) >= 0);
       
        do
        {
                x = xpoint(x1,x2);
                y = abs(function(x));
                x1,x2 = root(x1,x2);
        }while(y > pow(10,-6));
        printf("the root of function is %f",x);
       
        return 0;
}

//定义直线方程
float function(float x)
{
        float y;
        y = pow(x,3) - 5 * pow(x,2) + 16 * x - 80.0;
        return y;
}

//求两点形成的直线与x轴的交点的横坐标
float xpoint(float x1,float x2)
{
        float function(float x);
       
        float y1 ,y2,x,y = 0;
        y1 = function(x1);
        y2 = function(x2);
        x = ((x1 -x2)/ (y1 -y2)) * (y - y2)+ x2;
        return x;
}

//跟新x1,x2,y1,y2
float root(float x1,float x2)
{
        float xpoint(float x1,float x2);
        float function(float x);
       
        float x,y,y1,y2,t;
        x =xpoint(x1,x2);
        y1 = function(x1);
        y =function(x);
        if ((y1 > 0 & y > 0) || (y1 < 0 & y < 0) )
        {
                x1 = x;
                y1 = y;
        }
        else
        {
                x2 = x;
                y2 = y;
        }
        return x1,x2;
}
(1) 取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应差太大,以保证(x1,x2)区间内只有一个根。
(2) 连接(x1,f(x1))和(x2,f(x2))两点,此线(即弦)交x轴于x。
(3) 若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新的x2
(4) 重复步骤 (2) 和 (3) , 直到 |f(x)|<ε 为止, ε为一个很小的数, 例如 10-6\. 此时认为 f(x)≈0

编程思路
(1) 用函数f(x)代表x的函数:x3-5x2+16x-80.
(2) 用函数调用xpoint (x1,x2)来求(x1,f(x1))和
   (x2,f(x2))的连线与x轴的交点x的坐标。
(3) 用函数调用root (x1,x2)来求(x1,x2)区间的
   那个实根。显然,执行root函数过程中要用
   到函数xpoint,而执行xpoint函数过程中要用
   到f函数。

猪猪虾 发表于 2020-10-24 14:45:46

风过无痕1989 发表于 2020-10-24 14:28
用DEV_C++5.11 TMD-GCC4.9.2 32-bit release 编译通过了,具体的怎么解你的方程,我就不知道了

题目和解题思路在最下面,程序我修改过了,输入2,6,输出的结果应该是5

风过无痕1989 发表于 2020-10-26 04:08:29

猪猪虾 发表于 2020-10-24 14:45
题目和解题思路在最下面,程序我修改过了,输入2,6,输出的结果应该是5

为了你这个程序,将我忘得干干净净的数学又复习了一遍


#include <stdio.h>
double x,x1,x2;         // 定义全局变量

double f(double x)
{
    double c;
    c = x * x * x - 5 * x * x + 16 * x - 80;
    return(c);
}

double root(double x1,double x2)
{
    do
    {
      double k,b;
      k = (f(x1) - f(x2)) / (x1 - x2);// 过点 (x1,f(x1)), (x2,f(x2)) 的弦
      b = f(x1) - k * x1;
      x = - b / k;
      if(f(x) * f(x1) >= 0)// 若f(x)与f(x1)同符号,则根必在(x,x2)区间内
        {
            x1 = x;            // 将x作为新的x1
        }
      if(f(x) * f(x2) >= 0)// 若f(x)与f(x2)同符号,则根必在(x1,x)区间内
        {
            x2 = x;            // 将x作为新的x2
        }
    }while(f(x) < -0.00001 || f(x) > 0.00001);// 精度要求判断
    return f(x);
}

int main()
{
    while(f(x1) * f(x2) >= 0)// 当输入两个数大于0为真时,继续重新输入
    {
      printf("输入预估的实根区间的两个数值 x1,x2: ");
      scanf("%lf%lf",&x1,&x2);
    }
    root(x1,x2);
    printf("%f\n",x);
    return 0;
}
页: [1]
查看完整版本: 求方程的近似解,第18行报错,expected primary-expression before float