利用牛顿方法求解非线性方程(MatLab)

一、算法原理

1. 牛顿方法的算法原理

牛顿方法(Newton’s Method),也称为牛顿-拉弗森方法,是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根,具体原理如下:

输入:要求解的非线性方程 f ( x ) = 0 f(x) = 0 f(x)=0,以及初始猜测值 x 0 x_0 x0

输出:近似根 x ∗ x^* x

  1. 初始化 x 0 x_0 x0 作为初始猜测值。
  2. 进行迭代:
    • 计算 f ( x k ) f(x_k) f(xk) f ′ ( x k ) f'(x_k) f(xk),其中 f ( x k ) f(x_k) f(xk) 是目标函数在当前猜测值 x k x_k xk 处的值, f ′ ( x k ) f'(x_k) f(xk) 是目标函数的导数在同一点的值。
    • 计算更新步骤: x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)
    • 检查终止条件,通常是检查 ∣ f ( x k + 1 ) ∣ |f(x_{k+1})| f(xk+1) 是否小于预定的精度阈值,或者检查 ∣ x k + 1 − x k ∣ |x_{k+1} - x_k| xk+1xk 是否小于精度阈值。
    • 如果满足终止条件,则输出 x k + 1 x_{k+1} xk+1 作为近似根,并结束迭代。
    • 否则,将 x k + 1 x_{k+1} xk+1 作为新的猜测值,回到步骤2。

这个过程会不断重复,逐渐逼近方程 f ( x ) = 0 f(x) = 0 f(x)=0 的根。

2. 牛顿方法的收敛情况分析和渐进误差常数

牛顿方法的收敛性和渐进误差常数与初始猜测值以及目标函数的性质有关。以下是一些关键的考虑因素:

收敛性

  • 牛顿方法通常以二次收敛的速度迅速逼近根。这意味着每次迭代都会显著减小误差。
  • 收敛性的成功与否取决于初始猜测值的选择。如果初始猜测值距离真实根足够接近,并且目标函数在根附近是光滑的(即一阶导数连续),那么方法通常会收敛。

渐进误差常数

  • 牛顿方法的渐进误差常数通常与目标函数的二阶导数(即曲率)有关。
  • 如果 f ′ ′ ( x ∗ ) f''(x^*) f′′(x)(其中 x ∗ x^* x 是方程的真实根)不等于零且非常接近,则渐进误差常数通常较小,迭代会更快地逼近真实根。
  • 渐进误差常数通常用 C C C 表示,可表达为: ∣ x k + 1 − x ∗ ∣ < = C ∣ x k − x ∗ ∣ 2 |x_{k+1} - x^*| <= C |x_k - x^*|^2 xk+1x<=Cxkx2,这说明误差减小得很快。

需要注意的是,牛顿方法也有一些限制和挑战,包括选择初始猜测值的困难、迭代可能发散的情况,以及对于多重根的处理。因此,在实际应用中,需要谨慎选择初始猜测值,并考虑算法的稳健性。

二、测试数据及结果

  1. 对每个方程,给出算法运行中的算法的输出结果
    请添加图片描述

  2. f ( x ) = 54 x 6 + 45 x 5 − 102 x 4 − 69 x 3 + 35 x 2 + 16 x − 4 f(x) = 54x^6 + 45x^5 - 102x^4 - 69x^3 + 35x^2 + 16x - 4 f(x)=54x6+45x5102x469x3+35x2+16x4,在区间[−2,2] 上画出函数,使用牛顿方法找出该区间上的所有的5 个根。对于哪些根,牛顿方法线性收敛,哪些二次收敛?
    要求:每次迭代中显示:“第x 次迭代解为: xxx”,并在停止迭代后显示“符合精度要求的解为xxx”。

% 清空工作区和命令窗口
clear;
clc;

% 创建符号变量
syms x;

% 定义目标函数
f = 54 * x^6 + 45 * x^5 - 102 * x^4 - 69 * x^3 + 35 * x^2 + 16 * x - 4;

% 绘制函数 f(x) 在区间 [-2, 2]
x_values = linspace(-2, 2, 1000);
y_values = double(subs(f, x, x_values));
figure;
plot(x_values, y_values);
title('Function f(x)');
xlabel('x');
ylabel('f(x)');

% 寻找区间 [-2, 2] 上的根
x0 = -2.0; % 初始猜测值
tol = 1e-8; % 精度要求
max_iter = 100; % 最大迭代次数
roots = []; % 存储根的数组

while x0 <= 2
    try
        root = newton_downhill(f, diff(f, x), x0, tol, max_iter);
        roots = [roots, root];
    catch
        % 如果未收敛到根,则继续下一个初始猜测值
    end
    x0 = x0 + 0.2; % 增加初始猜测值
end

% 显示找到的所有根
fprintf('找到的所有根为:\n');
disp(roots);

% 牛顿下山法函数
function root = newton_downhill(f, df, x0, tol, max_iter)
    x = x0;
    iter = 0;
    
    while iter < max_iter
        iter = iter + 1;
        f_val = double(subs(f, x));
        df_val = double(subs(df, x));
        x_new = x - f_val / df_val;
        
        fprintf('第 %d 次迭代 解为: %.8f\n', iter, x_new);
        
        if abs(x_new - x) < tol
            fprintf('符合精度要求的解为 %.8f\n', x_new);
            root = x_new;
            return;
        end
        
        x = x_new;
    end
    
    error('达到最大迭代次数,未找到满足精度要求的解');
end
  • 函数图像:
    请添加图片描述

  • 输出结果:
    请添加图片描述

  1. 给出牛顿方法及牛顿下山法的运行结果。
  • 寻找 4 x 4 − 6 x 2 − 11 4 = 0 4x^4 - 6x^2 - \frac{11}{4} = 0 4x46x2411=0 的根,并使用初始值 1 进行牛顿下山法求解:
function root = newton_downhill(f, df, x0, tol, max_iter)
    x = x0;
    iter = 0;
    
    while iter < max_iter
        iter = iter + 1;
        f_val = double(subs(f, x));
        df_val = double(subs(df, x));
        x_new = x - f_val / df_val;
        
        fprintf('第 %d 次迭代 解为: %.8f\n', iter, x_new);
        
        if abs(x_new - x) < tol
            fprintf('符合精度要求的解为 %.8f\n', x_new);
            root = x_new;
            return;
        end
        
        x = x_new;
    end
    
    error('达到最大迭代次数,未找到满足精度要求的解');
end

请添加图片描述

三、总结与思考

这次实验让我深入了解了牛顿迭代方法以及牛顿下山法在解决非线性方程中的应用。以下是我的总结和思考:

  1. 牛顿迭代方法:通过这次实验,我加深了对牛顿迭代方法的理解。该方法是一种迭代求根的技术,通过不断更新猜测值来逼近方程的根。它的关键是计算目标函数和其导数的值,以便求解新的猜测值。在实际应用中,选择合适的初始猜测值对于方法的收敛性至关重要。

  2. 牛顿下山法:本次实验引入了牛顿下山法,这是对传统牛顿迭代方法的改进。牛顿下山法克服了牛顿法对初始猜测值敏感的问题,通过引入步长来确保迭代方向是向着根的。这提高了方法的鲁棒性,使其更适用于实际问题。

  3. 代码实现和调试:编写MATLAB代码的过程让我学到了如何在计算机上实现数值方法。同时,我也学到了如何进行调试和错误处理。在编写代码时,要特别注意输入数据的有效性和算法的边界情况,以确保代码的稳健性。

  4. 根的重数判定:在本次实验中,我学到了如何通过计算一阶导数和二阶导数的值来判定根的重数。这是一个重要的数值分析概念,可以帮助我们理解根的收敛性和速度。

  5. 实际应用:通过解决具体的非线性方程,我认识到数值方法在实际问题中的广泛应用。无论是工程、科学还是金融领域,数值方法都是解决复杂问题的重要工具之一。

总的来说,这次实验为我提供了宝贵的经验,不仅增强了我的数值计算能力,还加深了我对数值方法和代码实现的理解。我将继续学习和探索这个领域,以提高自己的数值分析技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA&#xff1f; DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&…

移动端设计规范 - 文字使用规范

这是一篇关于移动端产品界面设计时&#xff0c;文字大小的使用规范&#xff0c;前端人员如果能了解一点的话&#xff0c;在实际开发中和设计沟通时&#xff0c;节省沟通成本&#xff0c;也能提高设计落地开发时的还原度。 关于 在做移动端产品设计时&#xff0c;有时候使用文字…

fpmarkets实例讲解止损,控制风险如此简单

止损和止盈是交易者在交易时都需要了解的两个基本设置&#xff0c;在上篇文章fpmarkets澳福和各位投资者分享 了止盈如何工作&#xff0c;今天我们继续实例讲解止损&#xff0c;在交易中控制不必要的风险。 止损单是基本交易订单之一。如果市场走向与预期相反&#xff0c;它会限…

[机器学习]LFM梯度下降算法

一.LFM梯度下降算法 2.代码实现 # 0. 引入依赖 import numpy as np import pandas as pd# 1. 数据准备 # 评分矩阵R R np.array([[4,0,2,0,1],[0,2,3,0,0],[1,0,2,4,0],[5,0,0,3,1],[0,0,1,5,1],[0,3,2,4,1],]) # 二维数组小技巧&#xff1a;取行数R.shape[0]和len(R)&#x…

【SPIE独立出版|长春理工大学主办】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and…

Windows Server 2025 Azure Arc 介绍

Azure Arc 是一个扩展 Azure 平台的桥梁&#xff0c;可帮助你构建可灵活地跨数据中心、边缘和多云环境运行的应用程序和服务。使用一致的开发、操作和安全模型来开发云原生应用程序。 Azure Arc 可在新的和现有的硬件、虚拟化和 Kubernetes 平台、物联网设备和集成系统上运行。…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…

【项目管理】整合管理

一、管理基础 1、项目整合管理由项目经理负责&#xff0c;项目经理负责整合所有其他知识领域的成果&#xff0c;并掌握项目总体情况。项目整合管理的责任不能被授权或转移&#xff0c;项目经理必须对整个项目承担最终责任。整合是项目经理的一项关键技能。执行项目整合时项目经…

西门子WINCC触摸屏的Audit功能:追溯生产数据与用户操作行为

1为什么要用Audit功能&#xff1f; 在许多工业领域&#xff0c;生产数据的可追溯性及其文档记录变得愈加重要&#xff0c;如医药行业、食品饮料以及相关的机械工程行业。与书面文档相比&#xff0c;以电子形式存储生产数据具有许多优点&#xff0c;如采集和记录数据更方便&…

【HarmonyOS】鸿蒙开发之页面路由——第2.4章

页面路由: 应用程序中实现不同页面之间的跳转和数据传递。 Router有两种页面跳转模式 1.router.pushUrl() 目标耶不会被替换当前页&#xff0c;而是压入页面栈&#xff0c;可以使用router.back()返回当前页 2.router.replaceUrl() 目标替换当前页&#xff0c;当前页会被销毁并…

一文读懂cookie、session和token

HTTP简介 HTTP协议&#xff08;超文本传输协议HyperText Transfer Protocol&#xff09;是一种无状态协议&#xff0c;协议本身不会对发送过的请求和对应的通信状态进行持久化处理。这样的好处是可以保持HTTP协议的简单性&#xff0c;高效率处理大量事务。 但是随之就会出现一…

代码随想录算法训练营第36天(贪心算法05 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

贪心算法 part05 435. 无重叠区间解题思路 763.划分字母区间解题思路补充 56. 合并区间解题思路不熟悉的基础语法知识 详细布置 今天的三道题目&#xff0c;都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c;但一看贪心解法&#x…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念&#xff08;了解&#xff09;二、单例模式1. 饿汉模式&#xff08;1&#xff09;概念&#xff08;2&#xff09;模拟实现&#xff08;3&#xff09;优缺点&#xff08;4&#xff09;适用场景 2. 懒汉模式&#xff08;1&#xff09;概念&#xff…

vue使用富文本

1、安装 cnpm install vue-quill-editor2、在main.js中引入 // 富文本 import VueQuillEditor from vue-quill-editor // require styles 引入样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.css Vue.use(VueQuill…

cesium-球体透明

在开发的过程&#xff0c;要求cesium加载的地球透明 只是地表透明还不能满足要求&#xff0c;只加载部分区域的方式来解决的 代码如下&#xff1a; <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"…

【C++进阶08】哈希的应用(位图and布隆过滤器)

一、位图 1.1 位图的概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序 给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 能想到的解决思路&#xff1a; 遍历&#xff0c;时间复杂度O(N)排序(O(NlogN)) 利用二分查找: logN放到哈…

centos搭建ftp踩坑记录

ftp服务器搭建参考b站视频 第1坑&#xff0c;开放端口后仍然无法连接&#xff1a; 这里不仅需要在防火墙打开20和21端口&#xff0c;还需要打开被动访问所使用的端口&#xff0c;也就是在配置文件vsftpd.conf中指定的被动访问接收端口。 pasv_enableYES pasv_min_port40000 p…

小红书论文刷新 SOTA:人体动作预测再升级,能精准到指尖

想象一下&#xff0c;你在玩一款 VR 游戏&#xff0c;准备伸手拿起一个虚拟杯子喝水。‍​​‌​‌​‎‎ 在传统的交互系统中&#xff0c;这通常需要你按下控制器上的特定按钮。但如果游戏集成了 EAI 框架&#xff0c;这一过程将变得无比自然。当你的手缓缓接近虚拟杯子时&…

数据库基础知识(一)

数据库基础知识&#xff08;一&#xff09; 一、数据库基本概念 1.1 数据 数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这 些符号是可识别的、抽象的。它不仅指狭义上的数字&#xff0c;而是有多 种表现形式&#xff1a;字母、文…

如何开通GitHub Copilot

GitHub Copilot 是由GitHub 和OpenAI共同开发的人工智能代码辅助工具&#xff0c;可以自动地生成高质量代码片段、上下文信息等。 通过自然语言处理和机器学习技术&#xff0c;能够通过分析程序员编写的代码、注释和上下文信息&#xff0c;自动生成代码&#xff0c;减轻程序员的…