精华内容
下载资源
问答
  • 牛顿迭代法 一元非线性方程求根 C语言实现

    牛顿迭代法 一元非线性方程求根 C语言实现

    标签:计算方法实验

    /*
        本实验用牛顿迭代法求f(x) = x - e^(-x) = 0在区间[0, 1]的根。
    */
    #include <stdio.h>
    #include <math.h>
    
    #define maxrept 1000  //最大迭代次数
    
    double f(double x){  //函数f(x)
        return (x - exp(-x));
    }
    
    double df(double x){  //f(x)的导数
        return (1 + exp(-x));
    }
    
    double iterate(double x){  //牛顿迭代函数
        return (x - f(x) / df(x));
    }
    
    int main(){
        double x1, d;
        double x0 = 0.5;  //迭代初值x0
        double eps = 0.00001;  //求解精度eps
        int k = 0;  //迭代次数
    
        do{
            k++;
            x1 = iterate(x0);
            printf("%d    %f\n", k, x1);
            d = fabs(x1 - x0);
            x0 = x1;
        }while(d >= eps && k < maxrept);
    
        if(k < maxrept)  printf("the root of f(x) = 0 is : x = %f, k = %d\n", x1, k);
        else  printf("\nthe iteration is failed!\n");
    
        return 0;
    }
    

    实验结果:
    output

    展开全文
  • 不动点迭代法 一元非线性方程求根 C语言实现

    不动点迭代法 一元非线性方程求根 C语言实现

    标签:计算方法实验

    /*
        本实验用迭代法求方程f(x) = e^(-x) - x + 1的根。
    */
    #include <stdio.h>
    #include <math.h>
    
    #define maxrept 1000  //最大迭代次数
    
    double fa(double x){  //迭代函数fa(x)
        return exp(-x) + 1;
    }
    
    int main(){
        double x1, d;
        double x0 = 100;  //迭代初值x0
        double eps = 0.0005;  //求解精度eps
        int k = 0;  //迭代次数
    
        do{
            k++;
            x1 = fa(x0);
            printf("%d    %f\n", k, x1);
            d = fabs(x1 - x0);
            x0 = x1;
        }while(d >= eps && k < maxrept);
        if(k < maxrept)  printf("the root of f(x) = 0 is x = %f, k = %d\n", x1, k);
        else  printf("the iteration is failed!\n");  //要求迭代公式收敛,否则会出现溢出
    
        return 0;
    }
    

    实验结果:
    output

    展开全文
  • 斯特芬森加速迭代法(Steffensen)/埃特金方法(Aitken) 一元非线性方程求根 C语言实现

    斯特芬森加速迭代法(Steffensen)/埃特金方法(Aitken) 一元非线性方程求根 C语言实现

    标签:计算方法实验

    斯特芬森加速迭代法(Steffensen)/埃特金方法(Aitken)较迭代法的优点:
    1.迭代法收敛-->加速收敛
    2.迭代法不收敛-->收敛
    
    /*
        方程f(x) = x^3 - 3 * x - 1 = 0有三个实根x1 = 1.8793, x2 = -0.34727, x3 = -1.53209.
        本实验采用下面两种计算格式,求的根x1或x2或x3.
    */
    #include <stdio.h>
    #include <math.h>
    
    double f1(double x){  //迭代函数f1(x)
        return (3.0 * x + 1) / (x * x);
    }
    
    double f2(double x){  //迭代函数f2(x)
        return 1.0 / (x * x - 3);
    }
    
    double Steffensen(double x){
        return x -((f1(x) - x) * (f1(x) - x) / (f1(f1(x)) - 2.0 * f1(x) + x));
    }
    
    int main(){
        double x1, d;
        double x0 = 0.5;  //迭代初值
        double eps = 0.0001;  //求解精度
        int k = 0;  //迭代次数
    
        do{
            k++;
            x1 = Steffensen(x0);   ///迭代函数
            printf("%d    %f\n", k, x1);
            d = fabs(x1 - x0);
            x0 = x1;
        }while(d >= eps);
        printf("the root of f(x) = 0 is x = %f, k = %d\n", x1, k);
    
        return 0;
    }
    

    f1(x):
    f1
    f1(x)Steffensen加速后:
    f1s
    f2(x):
    f2
    f2(x)Steffensen加速后:
    f2s

    展开全文
  • 总共8个实验,今天写的是方程求根里的通过牛顿迭代法求一元多次方程。若函数f(x)连续可导,将f(x)在点x_k 处进行一阶泰勒展开,有:令 f(x) = 0, 当f'(x_k) != 0 时,有:于是,我们可以得到迭代公式:关于牛顿...

    如果有时间,我会渐渐的把数值分析的实验写完。总共8个实验,今天写的是方程求根里的通过牛顿迭代法求一元多次方程的根。

    若函数f(x)连续可导,将f(x)在点x_k 处进行一阶泰勒展开,有:

    20db3718fcae

    令 f(x) = 0, 当f'(x_k) != 0 时,有:

    20db3718fcae

    于是,我们可以得到迭代公式:

    20db3718fcae

    关于牛顿迭代法了解到这就行了, 既然有了迭代公式,最主要的是如何通过编程实现它。

    一.输入

    既然是解方程,方程是必须输入的。但方程不可能原样的输入,所以我们要找到我们所需要的 必要信息:各项的系数、最高次幂、以及我们手动取的一个近似值

    系数和当前项的幂可以通过一个数组来解决。数组是种有序的线性结构,元素在里面是顺序存放的,所以从高次到低次顺序输入就可以了。为了方便,即使系数是0,0也需要输入,不能省略。输入最高次幂是为了分配数组空间和之后的计算服务的。

    二.计算f(x) 、f`(x)

    牛顿迭代法的关键就是迭代公式,迭代公式的关键就是计算函数值和函数导数的值。

    这里很简单,理清思路就可以了:

    // f(x)、f`(x)

    double f(double x, double *a, int n){

    double res = 0;

    int i;

    for(i = 0; i <= n; i++){

    res += a[i] * pow(x, n - i);

    }

    return res;

    }

    double ff(double x, double *a, int n){

    double res = 0;

    int i;

    for(i = 0; i <= n; i++){

    res += a[i] * (n - i) * (n - i - 1 >= 0 ? pow(x, n - i - 1) : 0);

    }

    return res;

    }

    注意一下f`(x)的计算,如果套用前面的求导方法就会出错。最后常数项应该单独处理,常数项的导数为0。

    20db3718fcae

    三.不断迭代到合适的精度

    迭代过程就是一个不断逼近准确根的过程,所以在精度已经足够好了,也就是说 x_k 和 x_k + 1 差值足够小的时候,结束迭代就可以了。

    // 初始时令last != x_k, 并保存x的值

    x_first = (last = x_k + 1) - 1;

    // 前后两次差值 < 0.00001 就结束循环

    while(fabs(x_k - last) > 0.00001){

    last = x_k;

    x_k = last - f(last, a, n) / ff(last, a, n);

    }

    四.例题 && 测试

    图片来自 《计算方法(李桂成)》

    20db3718fcae

    测试

    20db3718fcae

    五.完整代码(C语言)

    C代码:

    // 牛顿迭代法求一元n次方程根

    #include

    #include

    #include

    // f(x)、f`(x)

    double f(double x, double *a, int n){

    double res = 0;

    int i;

    for(i = 0; i <= n; i++){

    res += a[i] * pow(x, n - i);

    }

    return res;

    }

    double ff(double x, double *a, int n){

    double res = 0;

    int i;

    for(i = 0; i <= n; i++){

    res += a[i] * (n - i) * (n - i - 1 >= 0 ? pow(x, n - i - 1) : 0);

    }

    return res;

    }

    int main(){

    // n次幂、存储各项系数的数组a、循环变量i

    int n;

    double *a;

    int i;

    // x_k

    double x_k, last, x_first;

    // 输入n次幂

    printf("输入方程的次幂:");

    scanf("%d", &n);

    // 为a分配空间

    a = (double*) malloc(sizeof(double) * (n + 1));

    // 输入各项系数

    printf("输入方程各项系数(从高次到低次):");

    for(i = 0; i <= n ; i++){

    scanf("%lf", a + i);

    }

    // 开始秀

    printf("输入x的初始值:");

    scanf("%lf", &x_k);

    // 初始时令last != x_k, 并保存x的值

    x_first = (last = x_k + 1) - 1;

    // 前后两次差值 < 0.00001 就结束循环

    while(fabs(x_k - last) > 0.00001){

    last = x_k;

    x_k = last - f(last, a, n) / ff(last, a, n);

    }

    // 输出求得的根

    printf("方程在x = %.1lf 附近的根为:%.5lf", x_first, x_k);

    // end

    getchar();

    return 0;

    }

    展开全文
  • 一、迭代法求方程根/* 迭代法求一个数的平方根 */#define Epsilon 1.0E-6 /*控制解的精度*/#includemain(){float a,x0,x1;printf("请输入要求的数:");scanf("%f",&a);x0=a/2;x1=(x0+a/x0)/2;while(fabs(x1-x0)&...
  • 弦截 一元非线性方程求根 C语言实现
  • 牛顿迭代法求根——C语言

    万次阅读 多人点赞 2016-11-12 09:38:33
    牛顿迭代法求根的原理: 设r是 的,选取 作为r的初始近似值,过点 做曲线 的切线L,L的方程为 ,出L与x轴交点的横坐标 ,称x1为r的一次近似值。过点 做曲线 的切线...
  • 牛顿迭代法求方程根--C语言

    千次阅读 2017-07-19 20:10:15
    1087: 习题5-14 牛顿迭代法求方程 时间限制: 1 Sec 内存限制: 12 MB 提交: 35 解决: 32 [提交][状态][讨论版] 题目描述 用牛顿迭代法求下面方程在输入初值点附近的: 2x3-4x2+3x-6=0 要求...
  • 1.用牛顿迭代法求方程在1.5附近的:2X^3-4X^2+3X-6=0#include#includedouble func(double x) //函数{return 2*x*x*x-4*x*x+3*x-6.0;}double func1(double x) //导函数{return 6*x*x-8*x+3;}double root(double ...
  • 比如说我想一个函数f(x)=0f(x)=0f(x)=0的解,利用牛顿迭代法的话可以如下构造: xn+1=xn−f(xn)f′(xn)x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}xn+1​=xn​−f′(xn​)f(xn​)​ 代码 下面时C语言实现代码 #include &...
  • 用牛顿迭代法求根方程为ax^3 +bx^2+cx+d=0,系数a、b、c、d由主函数输入,x在1附近的一个实后,由主函数输出。 #include <stdio.h> #include <math.h> float solut(float a, float b...
  • 上次传的Jacobi迭代法方程的资源忘了把这个代码传上去这次补上
  • 牛顿法和割线法方程求根C语言

    千次阅读 2018-02-10 10:29:58
    (2) 编写割线迭代法的程序,非线性方程的解,并与牛顿迭代法作比较。 2 . 实验内容 (1) 用牛顿法下列方程: (2) 编写一个割线法的程序,求解上述各方程。 3 . 实验步骤 牛顿迭代法流程图: 割线法...
  • 上次传的gauss_Seidel迭代法方程的资源忘了把这个代码传上去这次补上
  • 分别用雅可比 迭代法与高斯塞德尔迭代法解下列方程组: 雅可比迭代法: #include&lt;stdio.h&gt; #include&lt;math.h&gt; #define eps 1e-6 #define max 100 //雅可比迭代法 void jacobi...
  • 《第4章-非线性方程求根迭代法》由会员分享,可在线阅读,更多相关《第4章-非线性方程求根迭代法(67页珍藏版)》请在人人文库网上搜索。1、第4章 非线性方程求根迭代法,本章重点介绍求解非线性方程 的几种常见...
  • 迭代法求平方根(c语言

    千次阅读 2020-07-31 14:58:14
    迭代法求 平方根 公式:a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次出的差的绝对值少于0.00001。 输出保留3位小数 输入 X 输出 X的平方根 样例输入 4 ...
  • 用牛顿迭代法求下面方程在1.5附近的; 第一我们从题中可以得到两个信息 (1)要用牛顿迭代法 首先我们得先知道什么叫做牛顿迭代法, 设x是f(x) = 0的,选取作为的初始近似值,过点做曲线的切线,y1 = f’(x) x+ b;...
  • 方程求根迭代法

    2016-05-19 21:24:29
    迭代法方程求根、埃特金加速迭代法
  • 牛顿法是一种近似求解非线性方程根的迭代...一维牛顿迭代法求解形如 f(x) =0 的,算法如下:选取一个接近函数零点的自变量 x 值作为起始点使用如下的迭代公式更新近似解如果得出的解满足误差要求,终止迭代,所得的...
  • 1.用牛顿迭代法求方程在1.5附近的:2X^3-4X^2+3X-6=0 #include #include double func(double x) //函数 {return 2*x*x*x-4*x*x+3*x-6.0;} double func1(double x) //导函数 {return 6*x*x-8*x+3;} double ...
  • //牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16=0的近似解。 ============================================================ */ ...
  • C++经典算法题-迭代法求方程根

    千次阅读 2020-01-08 14:41:23
    /* 迭代法求一个数的平方根 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include<math.h> main() { float a,x0,x1; printf("请输入要求的数:"); scanf("%f",&a); x0=a/2; ...
  • 这篇文章讲述的是算法初级部分的牛顿迭代法求方程根问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。 问题描述 编写用...
  • 牛顿迭代法求解方程C语言详解

    千次阅读 2019-10-30 15:42:58
    问题描述:用牛顿迭代法求解方程2x3-4*x2+3x-6=0在1.5附近的近似解,误差小于1e-5 #include <stdio.h> #include <math.h> int main () { float x,x0, f1, f2; printf("请输入一个近似解:\n"); ...
  • C语言实现雅克比迭代法求根

    千次阅读 2020-10-22 12:45:30
    雅克比迭代法求根C语言实现雅克比迭代法求根问题描述算法思想C语言程序实验结果 问题描述 设方程组Ax=bAx = bAx=b的系数矩阵AAA非奇异 ,且aii≠0{a_{ii}} \ne 0aii​​=0将AAA分裂为:A=D+L+UA = D + L + UA=D+L+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,454
精华内容 981
关键字:

迭代法方程求根c语言

c语言 订阅