精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201810/01/1538357246_185341.png)
  • 牛顿迭代法 一元非线性方程求根 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

    展开全文
  • 总共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;

    }

    展开全文
  • 牛顿迭代求根——C语言

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

    牛顿迭代法求根的原理:

    设r是
    的根,选取
    作为r的初始近似值,过点
    做曲线
    的切线L,L的方程为
    ,求出L与x轴交点的横坐标
    ,称x1为r的一次近似值。过点
    做曲线
    的切线,并求该切线与x轴交点的横坐标
    ,称
    为r的二次近似值。重复以上过程,得r的近似值序列,其中,
    称为r的
    次近似值,上式称为牛顿迭代公式
    用牛顿迭代法解非线性方程,是把非线性方程
    线性化的一种近似方法。把
    在点
    的某邻域内展开成泰勒级数
    ,取其线性部分(即泰勒展开的前两项),并令其等于0,即
    ,以此作为非线性方程
    的近似方程,若
    ,则其解为
    , 这样,得到牛顿迭代法的一个迭代关系式:
    题目:用牛顿迭代法求根。方程为ax3+bx2+cx+d=0。系数a,b,c,d的值一次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。结果保留两位小数。
    分析:该题目要求我们求1附近的一个实根,其实不管是在哪个数字附近,只要有while(fabs(x-x0)>=1e-5)这个条件就能够得到一个比较准确的近似值(如果不明白可以随便找几个数试一下,一定要按照牛顿迭代法的步骤来)。由分析得,我们一直是在求两点之间的距离,首先我们用到了xn这个点,通过数学关系,我们得到了xn+1这个点;然后我们又由xn+1这个点得到了一个更加接近于x*的点,接下来就是计算机枯燥的重复了,但是我们不能一直让它这么持续下去,所以我们加入了一个使循环结束的条件就是两点之间的距离无线下while(fabs(x-x0)>=1e-5)。分析得到,我们需要两个double型的存储空间。
    #include<stdio.h>
    #include<math.h>
    
    int main()
    {
        double solut(double,double,double,double );//函数原型声明
        double a,b,c,d;
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        printf("%.2f",solut(a,b,c,d));
        return 0;
    }
    
    double solut(double a,double b,double c,double d)
    {
        double x=1,x0;
        do
        {
            x0=x;
            x=x0-(((a*x+b)*x+c)*x+d)/((3*a*x+2*b)*x+c);
        }
        while(fabs(x-x0)>=1e-5);//为点xn+1与xn之间的距离,当两点的距离无限接近于0时,就时我们所要求的根x*。如果取x*这个点为例,我们发现方程在该点的切线与x轴的交点为x*,此时x与x0之间的距离为零。
        return x;
    }
    这个题目用到迭代法,说实话我的脑子转的慢,我到现在还没有学好这个方法。
     

    迭代法的类似题目:
    1:迭代法求两个数的最大公约数(辗转相除法)
    原理:设两数为a、b(a>b),用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继搜索续用r1除r2,……如此下去,直到能整除为止。当然a与b的大小并不需要在意,因为在第一次辗转相除后,二者的位置关系就发生了改变。
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a,b;
        scanf("%d %d",&a,&b);
        int maxgys(int a,int b);//函数原型声明
        printf("%d",maxgys(a,b));
        return 0;
    }
    int maxgys(int a,int b)
    {
        while(b!=0)
        {
            int r;
            r=a%b;
            a=b;
            b=r;
        }
        return a;
    }
    

    2:Fibonacci数列也可以用到迭代法
    原理:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
      
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        long n;
        scanf("%ld",&n);
        void fibonacci(long);
        fibonacci(n);
        return 0;
    }
    void fibonacci(long n)
    {
        long f1,f2,fn,i;
        f1=1;
        f2=2;
        printf("%ld %ld ",f1,f2);
        for(i=1;i<=n-2;i++)
        {
            fn=f1+f2;
            f1=f2;
            f2=fn;
            printf("%ld",f2);
            printf(" ");
        }
    }
    























































    
    展开全文
  • 斯特芬森加速迭代法(Steffensen)/埃特金方法(Aitken) 一元非线性方程求根 C语言实现
  • 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+...
  • 问题:方程的。 代码:#include #include int main() { double solut(double,double,double,double ); double a,b,c,d; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); printf("%.2f",solut(a,b,c,d));; return
  • 用牛顿迭代求根。方程为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...
  • C语言迭代求根.doc

    2020-09-01 13:34:00
    PAGE 创建时间2012-4-23 实验题目 结构化程序设计 实验时间 201 实验地点 DS1402 实验成绩 实验性质 验证性 设计性 综合性 教师评价 算法/实验过程正确 源程序/实验内容提交 程序结构/实验步骤合理 实验结果正确 ...
  • 2405: C语言习题 牛顿迭代求根 时间限制:1 Sec内存限制:128 MB 提交:562解决:317 题目描述 用牛顿迭代求根。方程为ax3+bx2+cx+d=0。系数a,b,c,d的值一次为1,2,3,4,由主函数输入。求x在1附近的一个...
  • 2405: 牛顿迭代求根Description 用牛顿迭代求根。方程为ax3+bx2+cx+d=0ax^3+bx^2+cx+d=0。系数a,b,c,d的值一次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。结果保留两位小数。Input...
  • 牛顿迭代方程--C语言

    千次阅读 2017-07-19 20:10:15
    1087: 习题5-14 牛顿迭代方程的 时间限制: 1 Sec 内存限制: 12 MB 提交: 35 解决: 32 [提交][状态][讨论版] 题目描述 用牛顿迭代下面方程在输入初值点附近的: 2x3-4x2+3x-6=0 要求...
  • C语言习题 牛顿迭代求根

    千次阅读 2015-12-27 16:54:44
    用牛顿迭代求根。方程为ax3+bx2+cx+d=0。系数a,b,c,d的值一次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。结果保留两位小数。 Input 系数a,b,c,d的值 Output x在1附近的一个实根 ...
  • 迭代求根

    2018-12-11 20:17:19
    迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。计算方法中使用迭代求根C语言实现算法。
  • 比如说我想一个函数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 &...
  • 编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实,要求计算精确到小数点后七位数字为止,并将出的近似结果与理论值2cos20 相比较。设二分法的初始迭代区间为 [1, 3],牛顿迭代法的...
  • 共回答了19个问题采纳率:89.5%牛顿迭代法牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x0作为第一个近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次...
  • 一:用迭代 x=√a。平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { ...
  • 修改方程,可达到任意曲线方程的目的,此处验证了一个平方根(效率肯定不如牛顿迭代),蛮准的。 转载请注明出处,联系我: t39q@163.com 本人热衷于数据库技术及算法的研究,志同道合之士, 欢迎探讨 /*输入...
  • 用牛顿迭代下面方程在1.5附近的; 第一我们从题中可以得到两个信息 (1)要用牛顿迭代法 首先我们得先知道什么叫做牛顿迭代法, 设x是f(x) = 0的,选取作为的初始近似值,过点做曲线的切线,y1 = f’(x) x+ b;...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

迭代求根c语言

c语言 订阅