二分法+牛顿迭代法+简化牛顿迭代法+牛顿下山法解方程的近似值
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()
二分法+牛顿迭代法+简化牛顿迭代法+牛顿下山法解方程的近似值相关推荐
- Matlab数值分析编程:牛顿下山法解方程
%通用代码 fun=inline('x^0.5-x^3+2','x');%手动输入函数表达式和自变量 dfun=inline('0.5*x^(-0.5)-3*x^2','x');%手动输入函数一阶导数 ...
- [计算机数值分析]牛顿下山法求方程的根
问题描述 一般来说,牛顿法的收敛性依赖于初值 x₀ 的选取,如果 x₀ 偏离方程的正解根 x* 较远,则牛顿法可能发散. 例:用牛顿法求方程 x³ - x - 1 = 0在 x = 1.5 附近的一个 ...
- 解方程 ( 迭代法/牛顿迭代/高斯消元 ) 详解及模板
欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 一.迭代法解方程 ( ...
- 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 ...
- 极坐标 c语言,牛顿 拉夫逊迭代法极坐标潮流计算C语言程序
<牛顿 拉夫逊迭代法极坐标潮流计算C语言程序>由会员分享,可在线阅读,更多相关<牛顿 拉夫逊迭代法极坐标潮流计算C语言程序(31页珍藏版)>请在人人文库网上搜索. 1.*利用牛 ...
- c语言jacobi迭代法,迭代法解方程:牛顿迭代法、Jacobi迭代法
利用迭代算法处理问题,需要做好以下三个方面的工做: 一.确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式.所谓 ...
- 牛顿下山法c语言_数值计算(二十九)修正牛顿法I求解方程的根
1 原理 2 计算结果 3 相关程序A function sys=NewtonK() %{ 程序功能: 1.使用修正牛顿法一求解非线性方程 2.fx=0; 3.算法实现! %}clear,clc,cl ...
- MATLAB之牛顿下山法
MATLAB之牛顿下山法 算法原理 matlab程序 算法原理 上一篇博客,我介绍了牛顿法迭代法,接下来我就们接着讲解一下什么是牛顿下山法. 一.迭代公式 在牛顿迭代过程中,若满足单调性|f(x(k+ ...
- 非线性方程的数值解法:牛顿法及牛顿下山法(含Matlab程序)
牛顿法及牛顿下山法 简介:牛顿迭代法是求解单变量非线性方程f(x)=0中最实用的方法,该方法在单根附近二阶收敛.但应用时要选用较好的初值x0近似才能保证迭代收敛.为克服这一缺点,可使用牛顿下山法.下面 ...
最新文章
- Docker-Compose搭建单体SkyWalking 6.2
- picACG本地缓存目录_7天用Go动手写/从零实现分布式缓存GeeCache
- Oracle Database 快捷版 安装 连接
- iOS开发核心动画之画图板
- java graphics透明_如何使用Graphics对象g绘制透明形状?
- windows下配置DNS服务器
- 记事本下编写并运行Java代码
- RStudio 使用ARM版Ruby mac M1 编译安装适用及x86Ruby安装使用 安装ARM版homebrew
- Android基础篇 读取 Assets 文件夹中的文件
- 完美解决浏览器主页被hao123劫持,打开浏览器时自动进入hao123主页怎么办
- 您只能在Photoshop CS4中做的3酷技巧
- php调用nexmo发送短信,使用Nexmo或Twilio仅使用电话号码进行登录和验证
- MacBookPro恢复出厂系统
- 如何投稿iMeta期刊?ScholarOne投审稿系统作者使用教程
- python多线程爬斗破苍穹
- 一个案例两种分析方法告诉你数据涨跌异动该如何处理?附送涨跌问题常见五种假设
- PCL学习笔记二:Registration (ICP算法)
- dhu 深度学习与应用实践
- Java入门基础(一)——Hello World
- Oracle入门(二)