当前位置: 首页 > news >正文

二分法和牛顿迭代法解方程实根,详解

目录

题目​编辑

二分法

解题思路

代码以及运行截图

牛顿迭代法

解题思路

代码和运行截图


题目

编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后7 位数字为止,并将求出的近似结果与理论值2cos20° 比较误差大小。
设二分法的初始迭代区间为 [1, 3],牛顿迭代法的起点为4。

二分法

解题思路

        根据中学知识,我们知道一个函数,比如题目里的这个,当x的取值满足这个函数为0,即满足题目条件,为实根。

        如果我们取x1为a,x2为b,那么如果fx1乘以fx2小于0,那么x1和x2之间至少有一个解。

        题目告诉了我们区间为1到3,我们取a为1,b为3,mid一直为a+b再除以2。

        如果fmid为0,即为解。

        如果fmid和fa同号,解就在mid和b之间,让a变为mid

        如果fmid和fb同号,解就在mid和a之间,让b变为mid

        由于题目要求精度要到小数点后七位,所以判断条件可以为b - a < 1e-8,表示理论值,可以使用这串代码theo = 2 * cos(20 * M_PI / 180)

        可以使用    cout << fixed << setprecision(7);控制c++里面输出的数保留到小数点后六位。

代码以及运行截图

#include<iostream>
#include<bits/stdc++.h>
using namespace std;double func(double x) {return x*x*x - 3*x - 1;
}int main()
{const double theo = 2 * cos(20 * M_PI / 180); // 理论值 2cos20°double tol = 1e-8; // 精确到小数点后7位需要容差1e-8double a = 1;double b = 3;double mid;while((b - a) >= tol) {mid = (a + b) / 2;if(func(mid) == 0.0) {break;}else if(func(mid) * func(a) > 0)a = mid;else if(func(mid) * func(b) > 0)b = mid;}cout << "使用二分法求解:" << endl;cout << fixed << setprecision(7);cout << "近似根: " << mid << endl;cout << "理论值: " << theo << endl;cout << "绝对误差: " << abs(mid - theo) << endl << endl;return 0;
}

 

牛顿迭代法

解题思路

起点为4,设置迭代次数为100次 

迭代的核心代码为x_new = x - fx / dfx;然后不断逼近实根,最终得到一个解。

代码和运行截图

#include<iostream>
#include<bits/stdc++.h>
using namespace std;double func(double x) {return x*x*x - 3*x - 1;
}double deriv(double x) {return 3*x*x - 3;//导数
}int main()
{const double theo = 2 * cos(20 * M_PI / 180); // 理论值 2cos20°double iteration = 0;double tolerance = 1e-8; // 精确到小数点后7位需要容差1e-8double x = 4;//牛顿迭代法起点while(iteration < 100) {//迭代次数在一百次以内double fx = func(x);double dfx = deriv(x);if (abs(fx) < tolerance) {break;}if (dfx == 0) {cout << "导数为零,无法继续迭代。" << endl;}double x_new = x - fx / dfx;if (abs(x_new - x) < tolerance) {break;}x = x_new;iteration++;}//牛顿迭代法求解cout << fixed << setprecision(8);cout << "使用牛顿迭代法求解:" << endl;cout << "近似根: " << x << endl;cout << "理论值: " << theo << endl;cout << "绝对误差: " << abs(x - theo) << endl;return 0;
}

 

http://www.xdnf.cn/news/378865.html

相关文章:

  • 第十九节:图像梯度与边缘检测- Laplacian 算子
  • 「OC」源码学习——cache_t的原理探究
  • C32-编程案例用函数封装获取两个数的较大数
  • IPFS与去中心化存储:重塑数字世界的基石
  • nuscenes_devkit工具
  • Windows:Powershell的使用
  • 进阶二:基于HC-SR04和LCD1602的超声波测距
  • 海纳思(Hi3798MV300)机顶盒遇到海思摄像头
  • 贪心算法专题(Part1)
  • AI大模型学习十七、利用Dify搭建 AI 图片生成应用
  • STL-to-ASCII-Generator 实用教程
  • SpringBoot2集成xxl-job详解
  • 大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
  • 差动讯号(3)弱耦合与强耦合
  • Linux数据库篇、第一章_01MySQL5.7的安装部署
  • Java基础 5.10
  • 致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】
  • LeetCode 热题 100 24. 两两交换链表中的节点
  • 计算机网络八股文--day1
  • suricata之日志截断
  • Python实例题:Python协程详解公开课
  • JAVA练习题(1) 卖飞机票
  • vue开发用户注册功能
  • 【入门】数字走向I
  • 求数组中的两数之和--暴力/哈希表
  • 构建休闲企业服务实训室:融合凯禾瑞华产品打造产教融合新生态
  • 红黑树删除的实现与四种情况的证明
  • 北京导游资格证备考单选题题库及答案【2025年】
  • 大型旋转机械信号分解算法模块
  • 猿人学第十二题-js入门