欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛顿法和割线法方程求根(C语言)

程序员文章站 2024-02-27 20:36:03
...

1 . 实验目的
(1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点。
(2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
2 . 实验内容
(1) 用牛顿法求下列方程的根:
牛顿法和割线法方程求根(C语言)
(2) 编写一个割线法的程序,求解上述各方程。
3 . 实验步骤
牛顿迭代法流程图:
牛顿法和割线法方程求根(C语言)
割线法:将上图所示的牛顿法流程图的迭代公式的替换为
牛顿法和割线法方程求根(C语言)
并且输入两个初始值即可。
4 . 程序设计
(1) 牛顿法

#include<stdio.h>
#include<math.h>
#define eps 1e-7                                    
#define eta 1e-7
//牛顿迭代法求根
float newton(float(*f)(float),float(*f1)(float),float x0)       //f为原方程,f1为其导数,x0为初值
{
    float x1,d;                                                 //x1为新的近似值
    int k=0;
    do
    {
        k++;
        x1=x0-(*f)(x0)/(*f1)(x0);                               //计算x1
        d=x1-x0;                          
        x0=x1;
        printf("x(%d)=%f\n",k,x0);
    }
    while(fabs(d)>eps&&fabs((*f)(x1))>eta);                     //当|x1-x0|<eps或|f(x1)|<eta时结束程序
    return x1;
}

float f(float x)  //第2问方程
{
    return x*exp(x)-1;
}

float f1(float x) //第2问方程求导
{
    return x*exp(x)+exp(x);
}
float f2(float x) //第1问方程
{
    return x*x-exp(x);
}

float f3(float x) //第1问方程求导
{
    return 2*x-exp(x);
}

float f4(float x) //第3问方程
{
    return log10(x)+x-2;
}

float f5(float x) //第3问方程求导
{
    return 1/(10*log(10))+1;
}

void main()
{
    float x0,y0,y1,y2;
    printf("please insert x0\n"); //输入初始值
    scanf("%f",&x0);
    printf("x(0)=%f\n",x0);
    y1=newton(f,f1,x0);
    y0=newton(f2,f3,x0);
    y2=newton(f4,f5,x0);
    printf("one answer is %f\n",y0); //第一问答案
    printf("two answer is %f\n",y1); //第二问答案
    printf("three answer is %f\n",y2); //第三问答案
}

(2) 割线法

#include<stdio.h>
#include<math.h>
#define eps 1e-7                                    
#define eta 1e-7
//割线法
float ge(float(*f)(float),float x1,float x0)       
{
    float x2,d;                                                 
    int k=0;
    do
    {
        k++;
        x2=x1-((*f)(x1)*(x1-x0))/((*f)(x1)-(*f)(x0));                               
        d=x1-x0;                          
        x0=x1;
        x1=x2;
        printf("x(%d)=%f\n",k,x0);
    }
    while(fabs(d)>eps&&fabs((*f)(x1))>eta);                    
    return x1;
}

float f(float x)   //第一问
{
    return x*x-exp(x);
}
float f1(float x)  //第二问
{
    return x*exp(x)-1;
}
float f2(float x)  //第三问
{
    return log10(x)+x-2;
}

void main()
{

    float x1,x0,y0,y1,y2;
    printf("please insert x1,x0\n");
    scanf("%f,%f",&x1,&x0);
    printf("x(0)=%f\n",x0);
    y0=ge(f,x1,x0);
    y1=ge(f1,x1,x0);
    y2=ge(f2,x1,x0);
    printf("one answer is %6f\n",y0);
    printf("two answer is %6f\n",y1);
    printf("three answer is %6f\n",y2);
}