112.求解非线性方程

简介: 112.求解非线性方程
#include "math.h"
#include "stdio.h"
int BinSearchRoot(a,b,h,eps,x,m) /*用二法计算非线性方程的实根*/
int m;
/*参数意义:
a    要求的根的下界
b    要求的根的上界,即:所求的根落在区间 [a,b]之内
h    递进的步长
eps  精度
x    根的值
m    预计的根的个数*/
double a,b,h,eps,x[];
{ 
  extern double Equation(); /*要求解的非线性方程*/
    int n,js;
    double z,y,z1,y1,z0,y0;
    n=0; z=a; y=Equation(z);
    while ((z<=b+h/2.0)&&(n!=m)) /*对给定步长的子区间进行搜索*/
  { 
    if (fabs(y)<eps)  /*当前的判定点是方程的根*/
    { 
      n=n+1; 
      x[n-1]=z;
            z=z+h/2.0; 
            y=Equation(z);
    }
        else /*当前点不是方程的根*/
    { 
      z1=z+h; 
      y1=Equation(z1);
      if (fabs(y1)<eps) /*下一个点是方程的根*/
      { 
        n=n+1;
        x[n-1]=z1;
        z=z1+h/2.0;
        y=Equation(z);
      }
      else if (y*y1>0.0) /*该区间内无根*/
      { y=y1; z=z1;}
      else   /*该区间内有根*/
      { 
        js=0;/*标志,0表示未找到根,1表示已经确定了根*/
        while (js==0)
        { 
          if (fabs(z1-z)<eps) /*区间的长度小于给定的精度,可以当作已经找到了根*/
          { 
            n=n+1;  
            x[n-1]=(z1+z)/2.0; /*把区间的中位值作为根*/
            z=z1+h/2.0; /*把寻找的位置放到下一个区间内*/
            y=Equation(z);
            js=1; /*在当前区间内已经找到了根*/
          }
          else /*区间比给定的精度大,则进行二分*/
          { 
            z0=(z1+z)/2.0;  /*区间二分*/ 
            y0=Equation(z0);
            if (fabs(y0)<eps) /*z0位置为根*/
            { 
              x[n]=z0; 
              n=n+1; 
              js=1;
              z=z0+h/2.0; 
              y=Equation(z);
            }
            else if ((y*y0)<0.0) /*[z,z0]内有根*/
            { z1=z0; y1=y0;} 
            else { z=z0; y=y0;}
          }
        }
      }
    }
  }
    return(n); /*返回根的个数*/
}
main()
{
  int i,n;
    static int m=6;
    static double x[6];
    clrscr();
    puts("This is a program to solve Nonlinear function\n   by Binary Divisive Procedure.");
    puts("\n The Nonlinear function is:");
    puts("\n f(x)=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0\n");
    n=BinSearchRoot(-2.0,5.0,0.2,0.000001,x,m);
    puts("\n >> Solve successfully!\n >> The results are:");
    printf(" >> The function has %d roots, they are:\n",n);/*输出根的个数*/
    for (i=0; i<=n-1; i++)
    printf(" >> x(%d)=%13.7e\n",i,x[i]);
    printf("\n Press any key to quit...\n");
    getch();
}
double Equation(x)
double x;
{
  double z;
  z=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0;
  return(z);
}
相关文章
|
决策智能
ortools求解非线性问题
ortools求解非线性问题
763 0
ortools求解非线性问题
Pell 方程
X^2-d*Y^2=1 若d不是完全平方数,则该方程有无穷多组(X,Y)解
837 0
|
C++
方程的解
问题描述: 给出方程组: 11x+13y+17z=2471 13x+17y+11z=2739 已知x,y,z均为正整数,请你计算x,y,z相加最小为多少 #include using namespace...
668 0
|
算法
03 回归算法 - 线性回归求解 θ(最小二乘求解)
回顾线性回归的公式:θ是系数,X是特征,h(x) 是预测值。 h(x) = θ0 + θ1x1 + θ2x2 + … + θnxn h(x) = Σ θixi( i=0~n ) h(x) = θTX = [θ1,θ2,θ3,…,θn] * [x1,x2,x3,…,xn]T 最终要求是计算出θ的值,并选择最优的θ值构成算法公式,使预测值能够尽可能接近真实值。
1292 0
|
机器学习/深度学习 算法
非线性世界的探索:多项式回归解密
非线性世界的探索:多项式回归解密
|
算法 Python 机器学习/深度学习
02 回归算法 - 线性回归求解 θ(最大似然估计求解)
回顾线性回归的公式:θ是系数,X是特征,h(x) 是预测值。 h(x) = θ0 + θ1x1 + θ2x2 + … + θnxn h(x) = Σ θixi( i=0~n ) h(x) = θTX = [θ1,θ2,θ3,…,θn] * [x1,x2,x3,…,xn]T 最终要求是计算出θ的值,并选择最优的θ值构成算法公式,使预测值能够尽可能接近真实值。
1941 0
|
算法
广义二项式定理求解系数
      我可以确定估计我们整个班都不知道怎么算,但是我们想知道,老师不讲,问她,她说一项项展开,吐槽一下,这是一个只会吹牛逼的组合数学老师,还是个女的……我在算法分析里看到的……
872 0

热门文章

最新文章