用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 ;带注释!

//用弦截法求一元三次方程的根x^3-5x^2+16x-80=0
#include<stdio.h>
#include<math.h>
 float f(float x) //定义子函数f(x) = x^3-5x^2+16x-80,当f(x) →0时,则x即为所求的实数根;
 {
     float y;
     y=((x-5.0)*x+16.0)*x-80.0;
     return(y);          //返回f(x)的值
 }
 
  float xpoint( float x1,float x2)//定义子函数xpoint,求出弦与x轴的交点的x0值;
  {
      float x0;
      x0=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));   //计算弦与x轴交点x0位置的值
      return(x0);                      //返回x0位置的值
  }
 
  float root(float x1,float x2) //定义子函数root,求近似实根
   {
       float x0;                 
       do      //关键循环步骤,未达到条件前一直do循环运算;
       {
         x0=xpoint(x1,x2);  //此处调用上面的子函数xpoint(x1,x2),得到弦与x轴交点位置x0的值
         if(f(x0)*f(x1)>0)  //此处调用子函数f(x),得到x轴x0位置的f(x0)值,得到x1位置的f(x1)值,如果f(x0)*f(x1)>0,即同符号的话;
              x1=x0;           //将x0赋值 →x1,则下次继续循环运算的区间为x0(x1)-x2
      else              //否则,如果f(x0)*f(x1)<0,即异号的话;
           x2=x0;          //将x0赋值 →x2 ,则下次继续循环运算的区间为x1-x0(x2)
       }
       while(fabs(f(x0))>=1e-6);//当型循环判断条件,1e-6为取值精度,f(x0)接近于0,即接近于x轴相交,如运算无结果可能循环次数太多,可减少幂的次数再试。
       return(x0);         //返回x0位置的值
   }
    
    main() //主函数
{
    float x1,x2,x0,f1,f2;
    do
    {
     printf("请输入预估的实根区间的两个数值x1,x2:\n");
     scanf("%f,%f",&x1,&x2); //输入两个数x1,x2
     }
     while (f(x1)*f(x2)==0);//当循环运算到f(x1)*f(x2)>=0时(0是必要条件参数),即f(x1)、f(x2)同符号,且任一个接近于0时,意味着与x轴接近相交,此时存在一个方程实根。
     x0=root(x1,x2);        //此处x0即为方程实根;
     printf("其中的一个方程实根为:%.4f",x0);
 }

举个例子:x1=-10,x2=10,运算结果为:

时间: 2024-10-07 11:35:50

用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 ;带注释!的相关文章

弦截法求一元三次方程的近似解

1 #include<stdio.h> 2 #include<math.h> 3 4 //计算一元三次方程的根大致分布位置 5 6 //计算的方程为 x*x*x-8*x*x+12*x-30=0 7 8 //计算函数值 9 float f(float x) 10 { 11 return ((x-8.0)*x+12.0)*x-30.0; 12 } 13 14 //计算弦与坐标x轴的交点 15 16 float xpoint(float x1,float x2) 17 { 18 retu

弦截法求方程根

THE SECANT METHOD In numerical analysis, the secant method is a root-finding algorithm that uses a succession of roots of secant lines to better approximate a root of a function f. The secant method can be thought of as a finite difference approximat

用弦截法求解方程的根

//弦截法求解方程的根 //要求:输入左右两个端点x值 //结果:在一定精度范围内求解出方程的根 //难点:1)推导出x处的横坐标的求解公式 2)迭代掉原来的左端点或者右端点 #include "pch.h" #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x); double xpoint(double x1,

C#求一元二次方程的根

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 求一元二次方程的根 { public partial

(31-33)判断两个实型数据是否相等,求一元二次方程的根,逻辑型数据

(31)判断两个实型数据是否相等 1.abs求一个整型数据的绝对值,fabs,求一个浮点型数据的绝对值 (32)求一元二次方程的根 #include<stdio.h>#include<math.h>int main(void){ double a,b,c,d; printf("请依次输入二元一次方程的洗漱:\n"); scanf("%lf%lf%lf",&a,&b,&c); if (a==0) { printf(&qu

二分法求一元三次方程的一个实数根

一元一次方程的一般形式是$ax+b=0$,很容易解得$x=-\frac{b}{a}$.对于一元二次方程,也有一个简单的求根公式可以解出方程的根.但是一元三次方程的求根公式较为复杂,需分情况,编写程序的复杂度比前两个要大得多. 你可能已经听说过二分查找法,在已排序的数组中查找某一个数的时间复杂度从$O(n)$降到了$O(lg n)$.类似地,我们可以用二分法来求解一个一元三次方程的实数根. 以下是非递归版本的实现.calc函数用于计算方程取某个$x$值时方程左端的值.因为这个函数只是返回一个计算表

求一元二次方程的根

描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0. 输入输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数.输出输出一行,表示方程的解.若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=....若b2 > 4 * a * c,则两个实根不等,则输出

求一元二次函数的根

总时间限制:1000ms内存限制:65536kB 描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0. 输入 输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数. 输出 输出一行,表示方程的解.若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=...

Openjudge-计算概论(A)-求一元二次方程的根

描述: 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根,其中a不等于0.输入第一行是待解方程的数目n. 其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax2 + bx + c =0的系数.输出输出共有n行,每行是一个方程的根:若是两个实根,则输出:x1=...;x2 = ...若两个实根相等,则输出:x1=x2=...若是两