首页 > 其他分享 >C语言实现牛顿迭代法(Newton-Raphson Method)

C语言实现牛顿迭代法(Newton-Raphson Method)

时间:2024-04-04 14:34:15浏览次数:13  
标签:函数 迭代 复杂度 Newton 牛顿 导数 Raphson 迭代法

目录

前言

A.建议

B.简介

一 代码实现

二 时空复杂度

A.时间复杂度

B.空间复杂度

C.总结

三 优缺点

A.优点:

B.缺点:

C.总结:

四 现实中的应用


前言

A.建议

1.学习算法最重要的是理解算法的每一步,而不是记住算法。

2.建议读者学习算法的时候,自己手动一步一步地运行算法。

B.简介

牛顿迭代法(Newton-Raphson Method)是一种高效的数值方法,用于求解实数域或复数域上非线性方程 f(x)=0 的根。该方法基于函数 f在某一点x_k处的泰勒级数展开,并利用一阶导数 f′(x)近似地构造一条切线,通过切线与 xx-轴的交点来更新估计的根。迭代过程持续进行,直至达到预定的精度要求。

一 代码实现

以下是使用C语言实现牛顿迭代法的基本步骤和代码示例:

步骤一:定义目标函数 f(x) 和其导数 f′(x)

首先,你需要编写两个函数:一个表示目标非线性方程 f(x),另一个表示其导数 f′(x)。这两个函数应接受浮点数作为输入参数,并返回相应的浮点数结果。

// 目标函数 f(x)
float function_f(float x) {
    // 实现具体的非线性函数,例如:x^3 - ½ x - ⅓
    return pow(x, 3) - 0.5 * x - 1.0 / 3.0;
}

// 导数 f'(x)
float derivative_f(float x) {
    // 实现函数 f(x) 的一阶导数,例如:3x^2 - 0.5
    return 3 * pow(x, 2) - 0.5;
}

步骤二:实现牛顿迭代算法

接下来,编写一个主函数,其中包含牛顿迭代的核心逻辑。该函数通常接收以下参数:

  • 初始猜测值 x_initial
  • 目标精度 tolerance
  • 最大迭代次数 max_iterations(防止陷入无限循环)

在每次迭代中,按照牛顿迭代公式更新估计根:

同时检查是否达到终止条件(即误差小于给定的精度或达到最大迭代次数)。

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

#define MAX_ITERATIONS 1000
#define TOLERANCE 1e-6

// ... 上面定义的 function_f 和 derivative_f 函数 ...

void newton_raphson(float x_initial, float tolerance, int max_iterations) {
    float x_current = x_initial;
    float x_next;
    float error;

    int iteration_count = 0;

    while (iteration_count < max_iterations) {
        x_next = x_current - function_f(x_current) / derivative_f(x_current);
        error = fabs(x_next - x_current);

        if (error <= tolerance) {
            printf("Root found after %d iterations: %.6f\n", iteration_count + 1, x_next);
            break;
        }

        x_current = x_next;
        iteration_count++;
    }

    if (iteration_count == max_iterations) {
        printf("Max iterations reached without converging to the desired tolerance.\n");
    }
}

int main() {
    float initial_guess = 1.0;  // 示例初始猜测值
    newton_raphson(initial_guess, TOLERANCE, MAX_ITERATIONS);
    return 0;
}

上述代码实现了牛顿迭代法的基本框架,包括目标函数、导数函数、牛顿迭代函数以及主函数。主函数中,调用 newton_raphson 函数并传入初始猜测值、目标精度和最大迭代次数。在实际应用中,你需要根据具体要求解的非线性方程来修改 function_fderivative_f 函数的内容。运行此程序,它将输出找到的根及其对应的迭代次数,或者提示达到最大迭代次数而未收敛。

注意,牛顿迭代法的有效性和收敛速度取决于函数 ff 的特性(如连续性、可导性、导数的符号变化等)以及初始猜测值的选择。对于某些特殊函数或不适初始值,该方法可能不收敛或收敛速度较慢,此时可能需要考虑使用其他数值方法或调整初始猜测值。

二 时空复杂度

牛顿迭代算法(Newton-Raphson Method)是一种用于求解实数域或复数域上非线性方程 f(x)=0f(x)=0 的根的数值方法。以下是其时空复杂度的分析:

A.时间复杂度

牛顿迭代算法的时间复杂度主要取决于每次迭代所需的操作,主要包括:

  1. 计算目标函数值 f(x_k):对于给定的函数 f,计算其在点 x_k处的值通常需要执行与函数复杂度直接相关的操作。若 ff 是一个具有固定时间复杂度的函数(如多项式、指数函数、对数函数等),那么计算f(x_k)的时间复杂度通常为 O(1)或 O(n)(对于具有 n 项的多项式)。

  2. 计算导数值{f}'(x_k):同样,计算 f 在 x_k 处的一阶导数通常也具有固定时间复杂度。对于简单的函数,如多项式,其导数计算的时间复杂度与原函数相同。对于更复杂的函数,可能需要使用数值方法(如有限差分法)来近似计算导数,这时时间复杂度可能会稍高,但仍通常为 O(1) 或 O(n)。

  3. 更新估计根:根据牛顿迭代公式 ,更新估计根仅涉及一次减法、一次除法和一次赋值操作,这些操作的时间复杂度均为 O(1)。

综上所述,对于大多数常见的非线性函数,牛顿迭代算法每次迭代的时间复杂度通常为 O(1)或 O(n),其中 nn 通常很小,表示函数的项数或计算导数的复杂度。整个算法的总时间复杂度主要取决于收敛所需的迭代次数,而迭代次数与函数的性质(如连续性、可导性、导数的符号变化等)、初始猜测值的选择以及所要求的精度有关。在实践中,对于具有良好条件的函数和合适的初始猜测值,牛顿迭代法通常能在几次到几十次迭代内达到所需精度,因此其总时间复杂度通常远低于多项式时间。

B.空间复杂度

牛顿迭代算法的空间复杂度主要由以下因素决定:

  1. 存储变量:算法中需要存储当前估计根 x_k​、目标函数值 f(x_k)、导数值 {f}'(x_k)以及可能的临时变量。对于单变量问题,这些变量通常都是单个浮点数,所以空间复杂度为 O(1)。

  2. 额外数据结构:在处理多变量问题时,可能需要存储向量或矩阵来表示多元函数的值和梯度。此时,空间复杂度与问题的维度 d 有关,通常为 O(d)或 O(d^2)(对于需要存储梯度矩阵的情况)。

总的来说,牛顿迭代算法的空间复杂度通常为 O(1)或 O(d)(对于单变量问题)至 O(d^2)(对于多变量问题,需要存储梯度矩阵),其中 dd 是问题的维度。对于实际应用中常见的单变量或低维度问题,牛顿迭代算法的空间复杂度较低,对内存资源的需求较小。

C.总结

牛顿迭代算法具有较低的时间复杂度(常数级别或与问题维度线性相关)和空间复杂度(常数级别或与问题维度线性/平方相关),尤其适用于求解单变量或低维度非线性方程的根。其实际运行效率主要取决于函数的性质、初始猜测值以及所需的收敛精度,而非算法本身的复杂度。

三 优缺点

A.优点:

  1. 快速收敛:在适当条件下,牛顿迭代法具有二次收敛性,即迭代误差以指数速度减小。对于具有良好条件的函数(如函数在根附近光滑且导数不为零),只需少量迭代即可达到较高的精度。

  2. 无需线性搜索:与一些线性搜索方法(如二分法、割线法)不同,牛顿迭代法在每一步迭代中直接计算下一个估计根,不需要在每轮迭代中搜索可能的根区间,因此效率较高。

  3. 适用于多变量问题:牛顿迭代法可以自然地推广到求解多变量非线性方程组,只需将单变量的导数替换为梯度向量,牛顿方向变为梯度的负伪逆乘以函数值的雅可比矩阵。这种方法称为牛顿-拉夫森方法,同样具有快速收敛特性。

  4. 适用于优化问题:牛顿法不仅用于求解非线性方程,还广泛应用于优化问题,如无约束最优化和约束最优化(通过引入拉格朗日乘子形成KKT系统)。在这些场景下,牛顿法可以高效地寻找目标函数的局部极小值。

  5. 适应性强:通过引入阻尼因子或Levenberg-Marquardt修正,牛顿法可以处理函数梯度接近于零(即接近鞍点或平坦区域)的情况,以及在某些情况下改善收敛性。

B.缺点:

  1. 对函数性质依赖性强:牛顿法的收敛速度和收敛性高度依赖于目标函数的性质。对于函数不连续、导数不存在或在根附近导数接近于零(如函数有平坦区域或鞍点)的情况,牛顿法可能无法收敛,或者收敛速度极其缓慢。

  2. 需要计算导数:牛顿法要求目标函数可导且能有效地计算导数值。对于复杂函数或高维问题,计算精确导数可能非常困难或计算成本高昂,此时可能需要使用数值方法(如有限差分)近似导数,这会增加计算负担并可能导致迭代稳定性下降。

  3. 对初始猜测值敏感:牛顿法的收敛性对初始猜测值的选择很敏感。如果初始猜测值远离真实根,或者位于函数的多个根之间,牛顿法可能无法收敛到预期的根,甚至可能发散。为保证收敛,有时需要精心选择初始猜测值或采用多起点策略。

  4. 需要求解线性系统:在多变量问题中,牛顿迭代需要求解雅可比矩阵与梯度向量的乘法,即求解一个线性系统。对于大型问题,雅可比矩阵可能非常大,直接求逆或解线性系统可能非常耗时且占用大量内存。通常采用迭代线性求解器(如共轭梯度法、预条件共轭梯度法、GMRES等)或稀疏矩阵技术来处理这个问题。

  5. 不适合求解多重根:当函数有多个重根时,牛顿法可能会收敛到根的某一侧而不是根本身,除非恰巧选择了非常接近根的初始猜测值。对于这类问题,可能需要采用专门的方法(如不动点迭代法、反向传播法等)或对牛顿法进行修正。

C.总结:

牛顿迭代算法在处理具有良好性质的单变量或低维非线性问题时具有快速、直接的收敛优势,尤其适用于优化问题。然而,其对函数性质、初始猜测值以及导数计算的要求较高,且在处理高维问题、函数性质较差或存在多重根时可能面临挑战。实际应用中,需要根据具体问题特点选择合适的牛顿法变种或与其他数值方法结合使用,以平衡收敛速度、稳定性与计算成本。

四 现实中的应用

牛顿迭代算法(Newton-Raphson Method)因其快速的收敛速度和广泛的适用性,在现实世界中有众多应用。以下是一些典型的实例:

  1. 科学计算与工程问题

    • 物理与化学模型求解:在物理和化学领域,许多现象可以用非线性微分方程描述。牛顿迭代法常用于求解这些方程的数值解,如热传导方程、流体力学中的纳维-斯托克斯方程、化学反应动力学模型等。
    • 控制系统设计:在控制理论中,牛顿迭代法用于计算控制系统的设计参数,如PID控制器的比例增益、积分时间常数和微分增益,以达到期望的系统响应特性。
    • 结构力学分析:在土木工程、航空航天等领域,牛顿迭代法用于求解结构力学问题,如计算梁、壳体、框架等结构在载荷作用下的变形和应力分布。
  2. 优化问题

    • 无约束优化:牛顿法及其变种(如BFGS、L-BFGS、SQP等)广泛应用于无约束最优化问题,如参数估计、机器学习模型训练(如神经网络权重更新)、材料设计、电路设计等。
    • 约束优化:在约束优化问题中,如线性规划、二次规划、非线性规划,牛顿法结合拉格朗日乘子法或罚函数法,通过求解KKT系统来寻找可行域内的局部最优解。
  3. 信号处理与图像处理

    • 滤波器设计:在数字信号处理中,牛顿迭代法用于设计满足特定频率响应特性的数字滤波器,如IIR滤波器的系数优化。
    • 图像恢复与去噪:在图像处理领域,牛顿法用于解决图像恢复、去噪、超分辨率等问题,通过最小化目标函数(如基于图像模型的损失函数)来估计原始图像。
  4. 金融与经济建模

    • 衍生品定价:在金融工程中,牛顿法用于计算期权、期货、互换等金融衍生产品的理论价格,如Black-Scholes公式中的欧式期权定价问题。
    • 风险管理:牛顿迭代法用于求解风险度量(如VaR、CVaR)的优化问题,帮助金融机构评估和管理市场风险、信用风险等。
  5. 生物与医学应用

    • 生物动力学模拟:在生物科学中,牛顿迭代法用于模拟生物系统的动力学行为,如种群动态模型、疾病传播模型、药物代谢动力学模型等。
    • 医学影像重建:在医学成像技术(如CT、MRI、PET)中,牛顿法用于从测量数据中重建图像,如迭代投影重建算法。
  6. 机器学习与人工智能

    • 深度学习训练:在训练深度神经网络时,牛顿法或其变种(如Hessian-free optimization)用于更新网络权重和偏置,以最小化损失函数。
    • 强化学习:在强化学习算法中,如策略梯度方法,牛顿法用于计算最优策略参数的更新方向。

总之,牛顿迭代算法凭借其强大的求解非线性方程和优化问题的能力,广泛应用于科学计算、工程设计、信号处理、金融建模、生物医学、机器学习等诸多领域,是现代科学技术中不可或缺的数值计算工具。

标签:函数,迭代,复杂度,Newton,牛顿,导数,Raphson,迭代法
From: https://blog.csdn.net/weixin_56154577/article/details/137195489

相关文章

  • 代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二
    文章目录二叉树的递归遍历思路CPP代码二叉树的迭代遍历思路前序遍历后序遍历后序遍历二叉树的统一迭代法二叉树的递归遍历144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历文章讲解:二叉树的递归遍历视频讲解:每次写递归都要靠直觉?这次带你学......
  • 数值分析复习:Newton-Cotes求积公式及复合求积公式
    文章目录1.中矩形公式2.梯形公式3.Simpson(辛普森)公式4.Newton-Cotes(牛顿-科特斯)求积公式5.各种求积公式的性质6.复合求积公式本篇文章适合个人复习翻阅,不建议新手入门使用本专栏:数值分析复习的前置知识主要有:数学分析、高等代数、泛函分析1.中矩形公式......
  • 反问题:迭代法
    反问题:迭代法Date:2024/03/27Reference:Colton,D.&Kress,R.InverseAcousticandElectromagneticScatteringTheory.vol.93(SpringerInternationalPublishing,Cham,2019).p170-p180使用迭代法求解反散射问题中的反障碍问题,主要想法是基于牛顿迭代。此节的......
  • Newtonsoft.Json/Json.NET忽略序列化时的意外错误
    在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列化与反序列化的库。而在使用中常会遇到反序列化Json时,遇到不规则的Json数据解构而抛出异常。Newtonsoft.Json 支持序列化和反序列化过程中的错误处理。允许您捕获错误并选择是处理它并继续序列化,还是让错误冒泡并抛......
  • 【Python】拉格朗日Lagrange插值与牛顿Newton插值求解
    实验原理熟悉并掌握Lagrange插值的构造原理;会计算在给定点的函数值Lagrange插值是一种基于Lagrange基函数的插值方法。给定一组数据节点(x,y),其中x是自变量,y是因变量,其插值的目标是构造一个多项式函数,通过这个多项式函数来拟合已知的数据节点,并用于对其他未知点进行插值预......
  • NewtonJson
    Newtonsoft.Json.xml<membername="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object)"><summary>SerializesthespecifiedobjecttoaJSONstring.</summary><param......
  • 【数学】以普通高中生的眼光深入牛顿迭代法
    Newton'smethodforfindingroots目录目录前言&前置知识基础应用:手动开方优化:牛顿下山法闲话前言&前置知识前置知识:导数的定义与基本运算如今whk确确实实讲了牛顿法,就是那个切线求导数近似解,效率是二分法的忘了多少倍。(不觉得这很酷吗)那么牛顿迭代到底有没有比课本......
  • 牛顿迭代法求平方根
      publicclassCalcUtils{publicstaticvoidmain(String[]args){System.out.println(sqrt(8));}publicstaticdoublesqrt(doublec){if(c<0)returnDouble.NaN;doubleerr=1e-15;doublet=c;......
  • C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序
    https://www.cnblogs.com/s0611163/p/11872484.html测试结果整理后: 结论:1、这几个工具中,protobuf-net序列化和反序列化效率是最快的2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多3、Newtonsoft.Json序列化后的文件体积比较大4、Newtonsoft.Json在序列化反序列......
  • 使用Newtonsoft.Json进行Json与XML相互转换
    XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析好像没啥难度。今天突然发现Newtonsoft.Json中有关于Json和XML互转的方法,所以顺带记录总结一下。一、关于Newtonsoft.JsonNewtonsoft.Json(Json.Net)是一款.NET中开源的Json序列化和反序列化类库。Json.Net是一个读写Json效......