说说用C语言求根的那些事儿


C语言——求根;计算机只识别01,那么问题来了,作为计算工具如何解决数学问题?其实,计算机是死东西,都是程序员用计算机的的思维去加数学公式计算数学题的。听起来好高端的样子,其实啊,也就那么回事儿,

请看~~求平方根,也许你会说,这还不简单直接调用square函数就好了,这个还用说么?可是我若问你那么square函数是如何实现求平方根的呢?怎么样是不是没那么简单呢?且看:

  • 牛刀小试~ 迭代法求平方根 

数学公式为X(n+1)=1/2*(X(n)+a/X(n));

算法如下:

1)设定一个X0的值;

2)用上述公式求出x的下一个值x1

3)再将x1带入上述公式右侧的Xn,求出下一个Xn+1

4)如此继续下去知道最后两次求出的X的值(XnXn+1)满足关系:|Xn+1-Xn|<10e-5;

为了便于说明,现用x0x1,先令初值x0=a/2;求出x1,源代码如下:

#include<stdio.h> 
#include<math.h>
int main()
{
    float a,x0,x1;
    printf("Enter a positive number: ");
    scanf("%f",&a);
    x0=a/2;
    x1=(x0+a/x0)/2;
    do
    {
     x0=x1;
     x1=(x0+a/x0)/2;
    }while(fabs(x0-x1)>=10e-5);
    printf("The square root of %5.2f is %8.5f\n",a,x1);
    return 0;
}


运行截图:

  • 升级版求一元高次方程的根~牛顿迭代法

又称牛顿切线法:先任意设定一个与真实根接近的x0作为第一次近似根,由x0求出f(x0),过点(x0,f(x0))作f(x)的切线,交x轴于x1,把x1作为第二次近似根,再过x1作点(x1,f(x1))的切线交x轴于x2,如此继续,直到接近真实根x为止,由此可得下

公式:x1=x0-f(x0)/f‘(x0)这就是牛顿迭代公式。例如求2x^3-4x^2+3x-6=0的根

f(x)=2x^3-4x^2+3x-6     变形为f(x)=((2x-4)x+3)x-6   进一步f’(x)=6x^2-8x+3=(6x-8)+3

用这种方法表示的表达式在运算时可以节省时间,由原来的多次指数运算改为乘法和加法运算。源代码如下:

#include<stdio.h> 
#include<math.h>
int main()
{
    double x1,x0,f,f1;
    x1=1.5;
    do
    {
      x0=x1;
      f=((2*x0-4)*x0+3)*x0-6;
      f1=(6*x0-8)*x0+3;
      x1=x0-f/f1;
    }
    while(fabs(x1-x0)>=10e-5);
    printf("The root of 2x^3-4x^2+3x-6=0 is %5.2f\n",x1);
    return 0;
}

运行截图:



posted @ 2015-01-21 22:05  家号  阅读(1346)  评论(0编辑  收藏  举报