非线性方程求根迭代法

本文介绍了非线性方程求根的迭代法,包括简单迭代法、牛顿迭代和牛顿下山法。通过编程实现这些方法,并探讨了迭代格式选择的重要性,以及初值对迭代速度的影响。实验过程中的代码参考和结果分析,旨在提升将数学知识应用于实际问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、写在前面

 实验目的

(1) 熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法
(2) 能编程实现简单迭代法,牛顿迭代及牛顿下山法
(3) 认识选择迭代格式的重要性
(4) 对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响

 实验内容

这里写图片描述

**本次实验参考公式**

这里写图片描述

二、实验过程
【参考代码】

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double IterationFunction(double x)    //迭代函数
{
    return pow(x+1.0, 1.0/3);
}

double function(double x)    //原函数 f(x)
{
    return x*x*x-x-1;
}

double derivativeFunction(double x)    //导函数 f'(x)
{
    return 3*x*x-1;
}

double Iteration(double x0, double e, int N)    //一般迭代算法
//输入参数: x0 初值, e 精度, N 最大迭代次数
{
    int k = 0;    //当前迭代次数
    double x1;    //终值
    printf("--------------------------一般迭代算法过程----------------------------\n");
    printf("k = %d:    x%d = %lf\n", k, k, x0);
    while(k < N)
    {
        x1 = IterationFunction(x0);
        k++;
        printf("k = %d:    x%d = %lf\n", k, k, x1);
        if(fabs(x1-x0) < e)    //判断是否达到精度,满足要求结束程序,否则继续迭代
            return x1;
        x0 = x1;
    }
    return 0;    //迭代失败:迭代次数超过最大迭代次数,精度未达到要求
}

double AitkenAccelerate(double x0, double e, int N)    //Aitken加速算法
//输入参数: x0 初值, e 精度, N 最大迭代次数、
{
    int k = 0;
    double x1, x2, x3;
    printf("--------------------------Aitken加速算法过程----------------------------\n");
    printf("k = %d:   x%d=%lf\n", k, k, x0);
    while(k < N)
    {
        x1 = IterationFunction(x0);    //迭代
        x2 = IterationFunction(x1);    //迭代
        x3 = x2 - (x2-x1)*(x2-x1)/(x2-2*x1+x0);    //改进
        k++;
        printf("k = %d:   x%d(-)=%lf,   x%d(~)=%lf,   x%d=%lf\n", k, k, x1, k, x2, k, x3);
        if(fabs(x3-x0) < e)
            return x3;
        x0 = x3;
    }
    return 0;
}

double Newton(double x0, double e, int N)    //Newton算法
{
    int k = 0;
    double x1;
    printf("---------------------------Newton算法过程---------------------------\n");
    printf("k = %d:    x%d = %lf\n", k, k, x0);
    while(k < N)
    {
        if(0 == derivativeFunction(x0))    //分母不可为0
            return -1.999999;     //导函数值为0,返回-1.999999作为错误标志
        x1 = x0 - function(x0)/derivativeFunction(x0);     //使用Newton迭代函数
        k++;
        printf("k = %d:    x%d = %lf\n", k, k, x1);
        if(fabs(x1-x0) < e)
            return x1;
        x0 = x1;
    }
    return 0;
}


double NewtonDown(double x0, double e, int N)    //Newton下山算法
{
    int k = 0;
    double x1;
    double down = 1.0;    //下山因子
    printf("---------------------------Newton下山算法过程---------------------------\n");
    printf("k = %d:    x%d = %lf\n", k, k, x0);
    while(k < N)
    {
        if(0 == derivativeFunction(x0))    //分母不可为0
            return -1.999999;     //导函数值为0,返回-1.999999作为错误标志
        down = 1.0;
        x1 = x0 - down*function(x0)/derivativeFunction(x0);     //使用Newton迭代函数
        while(fabs(function(x1)) >= fabs(function(x0)))
        {
            down /= 2;    //下山因子减半
            x1 = x0 - down*function(x0)/derivativeFunction(x0);
        }
        k++;
        if(down <= 0.0000001)
        {
            printf("下山失败,没有找到合适的下山因子,请另选初值\n");
            return 0;
        }
        printf("k = %d:    x%d = %lf, 下山因子 = %lf\n", k, k, x1, down);
        if(fabs(x1-x0) < e)
            return x1;
        x0 = x1;
    }
    return 0;
}

int main()
{
    double answer;
    answer = Iteration(0.6, 0.000001, 20);
    //在此将迭代次数设置尽可能大,不考虑迭代失败的情况
    printf("一般迭代算法求得最终结果: x = %lf\n\n", answer);
    answer = AitkenAccelerate(1.5, 0.000001, 10);
    printf("Aitken加速算法求得最终结果: x = %lf\n\n", answer);
    answer = Newton(0.6, 0.000001, 20);
    printf("Newton算法求得最终结果: x = %lf\n\n", answer);
    answer = NewtonDown(0.6, 0.000001, 20);
    printf("Newton算法求得最终结果: x = %lf\n\n", answer);
    return 0;
}

三、实验结果

这里写图片描述

四、写在后面
经历了几次有关数值分析的程序编写之后,有了一定的将数学知识转化为程序的能力,但是一些高级的算法还是得有较厚的数学功底,利用数学解决实际工程问题才是最终的目的,希望在这条道路上有所成长。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值