1、二分法

//求方程 2*x*x*x-4*x*x+3*x-6 的根
/* 二分法*/
#include<stdio.h>
#include<math.h>
#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return   2 * x * x * x - 4 * x * x + 3 * x - 6;
}
int main() {double x, y, x0, f1, f2, f0;printf("Please input the boundary of the value:");scanf("%lf%lf", &x, &y);// [x-x0-y] x0 = (x + y) / 2;f0 = func(x0);f1 = func(x);f2 = func(y);while (fabs(f0) >= Epsilon){if (f0 * f1 < 0){y = x0;f2 = func(y);}if (f0 * f2 < 0){x = x0;f1 = func(x);}x0 = (x + y) / 2;f0 = func(x0);}printf("用二分法求得方程的一个根:%f\n", x0);
}

2、牛顿迭代法

(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
百度百科–牛顿迭代法

2.1 普通的牛顿迭代法

//用牛顿迭代法 求方程 2*x*x*x-4*x*x+3*x-6 的根
/* 牛顿迭代法 */
#include<stdio.h>
#include<math.h>
//#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return 2 * x * x * x - 4 * x * x + 3 * x - 6.0;
}
double func1(double x) //导函数
{return 6 * x * x - 8 * x + 3;
}
double Newton() {double x0, x1 = 0.0, precision;// 可以选择1.0E-6为解的精度 printf("输入初始迭代值x0:");scanf("%lf", &x0);printf("迭代要求的精度:");scanf("%lf", &precision);x1 = x0 - func(x0) / func1(x0);while (fabs(x1 - x0) >= precision) {x0 = x1;x1 = x0 - func(x0) / func1(x0);}return x1;
}
int main() {double answer = Newton();if (answer != 0) {//可以直接看出答案不能为0,故作判断依据printf("%f", answer);}
}

2.2 定义迭代次数的牛顿迭代法

//用牛顿迭代法 求方程 2*x*x*x-4*x*x+3*x-6 的根
/* 牛顿迭代法 */
#include<stdio.h>
#include<math.h>
//#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return 2*x*x*x-4*x*x+3*x-6.0;
}
double func1(double x) //导函数
{return 6*x*x-8*x+3;
}
int Newton(double *x,double precision,int maxcyc)      //maxcyc  迭代次数
{double x1,x0;int k;x0=*x;for(k=0;k<maxcyc;k++){if(func1(x0)==0.0)//若通过初值,函数返回值为0{printf("迭代过程中导数为0!\n");return 0;}x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算if((fabs(x1-x0)<precision )|| (fabs(func(x1))<precision))//达到结束条件{*x=x1; //返回结果return 1;}else //未达到结束条件{x0=x1; //准备下一次迭代}}printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度return 0;
}int main()
{double x,precision;int maxcyc;printf("输入初始迭代值x0:");scanf("%lf",&x);printf("输入最大迭代次数:");scanf("%d",&maxcyc);printf("迭代要求的精度:");scanf("%lf",&precision);if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1{printf("该值附近的根为:%lf\n",x);}else //若函数返回值为0{printf("迭代失败!\n");}return 0;
}

3、简化牛顿法

就是简单的把导数用最开始的那个

3.1简化的牛顿法代码

//用牛顿迭代法 求方程 x^3- x-1=0的根
/* 简化牛顿法 */
#include<math.h>
#include<iostream>
using namespace std;
//#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return x * x * x - x * x - 1.0;
}
double func1(double x) //导函数
{return 3 * x * x - 2*x;
}
double Newton() {double x0, x1 = 0.0, precision;// 可以选择1.0E-6为解的精度 printf("输入初始迭代值x0:");cin >> x0;// printf("迭代要求的精度:");//cin >> precision;precision = 1.0E-6;double staticNum = func1(x0);x1 = x0 - func(x0) / func1(x0);while (fabs(x1 - x0) >= precision) {x0 = x1;x1 = x0 - func(x0) / staticNum;cout << func(x1) << " ";}return x1;
}int main() {double answer = Newton();if (answer != 0)cout << answer << endl;}

对比之前的牛顿法

//用牛顿迭代法 求方程 2*x*x*x-4*x*x+3*x-6 的根
/* 牛顿迭代法 */
#include<stdio.h>
#include<math.h>
//#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return x * x * x - x * x - 1.0;
}
double func1(double x) //导函数
{return 3 * x * x - 2*x;
}
double Newton() {double x0, x1 = 0.0, precision;// 可以选择1.0E-6为解的精度 printf("输入初始迭代值x0:");scanf("%f", &x0);// printf("迭代要求的精度:");//scanf("%f",&precision);precision = 1.0E-6;x1 = x0 - func(x0) / func1(x0);while (fabs(x1 - x0) >= precision) {x0 = x1;x1 = x0 - func(x0) / func1(x0);printf("%lf ", func(x1));}return x1;
}
int main() {double answer = Newton();if (answer != 0) {//可以直接看出答案不能为0,故作判断依据printf("%f", answer);}
}

已知在x=1.5附近有一个零点,所以
同时使用x0=1.5,对比收敛速度,明显知道之前没有简化的牛顿法比较慢

但是如果用0.6(一个偏离正确的值),会发现牛顿法可以求出而已。

4、牛顿下山法

4.1牛顿下山法代码

//用牛顿迭代法 求方程 x^3- x-1=0的根
/* 简化牛顿法 */
#include<math.h>
#include<iostream>
using namespace std;
//#define Epsilon 1.0E-6//解的精度
double func(double x) //函数
{return x * x * x -  x * x -1.0;
}
double func1(double x) //导函数
{return 3 * x * x - 2*x;
}
double Newton() {double x,x1,precision;// 可以选择1.0E-6为解的精度 printf("输入初始迭代值x0:");cin >> x;precision = 1.0E-4;double y = func(x);double r=1.0;         //下山因子int time = 1;while (abs(y) > precision) {r = 1;x1 = x - r * y / (func1(x));cout << x1 << " ";while (  abs(func(x1)) > abs(func(x))  ) {r = r / 2;x1 = x - r * y / func1(x);cout << x1 << " ";}x = x1;y = func(x);time += 1;}   return x;
}int main() {double answer = Newton();   if(answer!=0)cout << answer<<endl;}

对比可以发现,牛顿下山法快一点,变化幅度小。

补充:关于评论区的问题

如何实现牛顿下山法的过程,抱歉,用C++,我能力有限,我了解到可以用opencv和EasyX Graphics Library库,但对我来说,人生苦短,我用python

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.pyplot import MultipleLocatorEpsilon = 1.0E-6
def func(x:float) :#函数return x * x * x - x * x - 1.0def func1(x:float) :# 导函数return 3 * x * x - 2 * xdef Newton():x = eval(input("输入初始迭代值x0:")) # cin >> x;precision = Epsilony = func(x)r = 1.0;         # 下山因子X_List = []while abs(y) > precision:r = 1x1 = x - r * y / (func1(x))X_List.append(x1)# print(x1) #cout << x1 << " ";while abs(func(x1)) > abs(func(x)) :r = r / 2x1 = x - r * y / func1(x)X_List.append(x1)x = x1y = func(x)return x, X_Listdef main():answer, Y_List  = Newton()if answer != 0:print(answer) # cout << answer << endlX_List = [i+1 for i in range(len(Y_List))]    y_min,y_max = np.min(Y_List),np.max(Y_List)    my_y_ticks = np.arange(y_min,y_max,(-y_min+y_max)/len(X_List))plt.yticks(my_y_ticks)x_major_locator=MultipleLocator(1)# 把x轴的主刻度设置为1的倍数ax = plt.gca()ax.xaxis.set_major_locator(x_major_locator)plt.plot(X_List,Y_List,color='red', marker='o', linestyle='dashed', linewidth=1, markersize=5)plt.show()
main()

二分法+牛顿迭代法+简化牛顿迭代法+牛顿下山法解方程的近似值相关推荐

  1. Matlab数值分析编程:牛顿下山法解方程

    %通用代码 fun=inline('x^0.5-x^3+2','x');%手动输入函数表达式和自变量 dfun=inline('0.5*x^(-0.5)-3*x^2','x');%手动输入函数一阶导数 ...

  2. [计算机数值分析]牛顿下山法求方程的根

    问题描述 一般来说,牛顿法的收敛性依赖于初值 x₀ 的选取,如果 x₀ 偏离方程的正解根 x* 较远,则牛顿法可能发散. 例:用牛顿法求方程 x³ - x - 1 = 0在 x = 1.5 附近的一个 ...

  3. 解方程 ( 迭代法/牛顿迭代/高斯消元 ) 详解及模板

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 一.迭代法解方程 ( ...

  4. R语言 牛顿-拉夫森迭代法求方程组

    牛顿-拉夫森迭代法: xk+1=xk−[f′(x)]−1f(x)x_{k+1}=x_{k}-{[f'(x)]^{-1}}f(x)xk+1​=xk​−[f′(x)]−1f(x) 其中,f′(x)f'(x ...

  5. 极坐标 c语言,牛顿 拉夫逊迭代法极坐标潮流计算C语言程序

    <牛顿 拉夫逊迭代法极坐标潮流计算C语言程序>由会员分享,可在线阅读,更多相关<牛顿 拉夫逊迭代法极坐标潮流计算C语言程序(31页珍藏版)>请在人人文库网上搜索. 1.*利用牛 ...

  6. c语言jacobi迭代法,迭代法解方程:牛顿迭代法、Jacobi迭代法

    利用迭代算法处理问题,需要做好以下三个方面的工做: 一.确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式.所谓 ...

  7. 牛顿下山法c语言_数值计算(二十九)修正牛顿法I求解方程的根

    1 原理 2 计算结果 3 相关程序A function sys=NewtonK() %{ 程序功能: 1.使用修正牛顿法一求解非线性方程 2.fx=0; 3.算法实现! %}clear,clc,cl ...

  8. MATLAB之牛顿下山法

    MATLAB之牛顿下山法 算法原理 matlab程序 算法原理 上一篇博客,我介绍了牛顿法迭代法,接下来我就们接着讲解一下什么是牛顿下山法. 一.迭代公式 在牛顿迭代过程中,若满足单调性|f(x(k+ ...

  9. 非线性方程的数值解法:牛顿法及牛顿下山法(含Matlab程序)

    牛顿法及牛顿下山法 简介:牛顿迭代法是求解单变量非线性方程f(x)=0中最实用的方法,该方法在单根附近二阶收敛.但应用时要选用较好的初值x0近似才能保证迭代收敛.为克服这一缺点,可使用牛顿下山法.下面 ...

最新文章

  1. Docker-Compose搭建单体SkyWalking 6.2
  2. picACG本地缓存目录_7天用Go动手写/从零实现分布式缓存GeeCache
  3. Oracle Database 快捷版 安装 连接
  4. iOS开发核心动画之画图板
  5. java graphics透明_如何使用Graphics对象g绘制透明形状?
  6. windows下配置DNS服务器
  7. 记事本下编写并运行Java代码
  8. RStudio 使用ARM版Ruby mac M1 编译安装适用及x86Ruby安装使用 安装ARM版homebrew
  9. Android基础篇 读取 Assets 文件夹中的文件
  10. 完美解决浏览器主页被hao123劫持,打开浏览器时自动进入hao123主页怎么办
  11. 您只能在Photoshop CS4中做的3酷技巧
  12. php调用nexmo发送短信,使用Nexmo或Twilio仅使用电话号码进行登录和验证
  13. MacBookPro恢复出厂系统
  14. 如何投稿iMeta期刊?ScholarOne投审稿系统作者使用教程
  15. python多线程爬斗破苍穹
  16. 一个案例两种分析方法告诉你数据涨跌异动该如何处理?附送涨跌问题常见五种假设
  17. PCL学习笔记二:Registration (ICP算法)
  18. dhu 深度学习与应用实践
  19. Java入门基础(一)——Hello World
  20. Oracle入门(二)

热门文章

  1. 免费开源ETL工具KETTLE
  2. Cantor(有理数)
  3. anaconda linux卸载,Linux上Anaconda的卸载
  4. OFDM峰均比抑制matlab,一种降低OFDM峰均比的解决方法
  5. Elasticsearch 中的骚操作你确定不看看?
  6. 分布式全站爬虫——以搜狗电视剧为例
  7. java web 邮件_Javaweb_邮件发送
  8. mSystems:苏晓泉、徐健等发布全球微生物组结构和功能搜索平台2.0
  9. 计算机组成原理——微程序实验
  10. 【2016-10-14收获】Cloud IDEs