python二分法、牛顿法求根
二分法求根
思路:对于一个连续函数,左值f(a)*右值f(b)如果<0,那么在这个区间内[a,b]必存在一个c使得f(c)=0
那么思路便是取中间点,分成两段区间,然后对这两段区间分别再比较,跳出比较的判断便是精确度
# 二分法求根
# 函数为exp(x)*lnx - x**2
import math
# 定义需要求根的函数,等会方便调用
def func(x):
result = math.exp(x)*math.log(x) - x**2
return result
def binary(accuracy,left,right):
root = left
count = 1
acc = accuracy + 1
while acc > accuracy:
# 如果一开始左值或者右值满足条件,则打印
if abs(func(left)) < accuracy:
print(left)
elif abs(func(right)) < accuracy:
print(right)
else:
# 如果都不满足,那么进行二分
print(left)
mid = (left+right)/2
if func(left)*func(mid) < 0:
right = mid
else:
left = mid
count += 1
root = left
acc = abs(func(root))
# 这里分两次打印,是对不同需求进行输出,比如作为一个接口,那么上面的打印注释掉,下面的换成return即可
print("final %d round is %.6f"%(count,root))
1
1
1
1.375
...
1.6945991516113281
final 22 round is 1.694601
牛顿法求根
运用泰勒展开
$f(x) \approx f(x_0) + f'(x_0)(x-x_0)$
即假定一开始的点为$x_0$,那么即将更新的点$x$,应该令$f(x)=0$,那么进行迭代之后,有 $x_{k+1}=x_k-\frac{f(x_0)}{f'(x_0)}$,那么代码即可得到
# 牛顿法求根
# 函数为exp(x)*lnx - x**2
# 导数为exp(x)lnx+exp(x)*(1/x)-2*x
import math
def newton(accuracy,root):
new_root = root
acc = accuracy +1
count = 1
while acc > accuracy:
print("%d round is %.6f"%(count,new_root))
# 求值
y = math.exp(new_root)*math.log(new_root)-new_root**2
# 求导
y_hat = math.exp(new_root)*math.log(new_root)+math.exp(new_root)*(1/new_root)-2*new_root
# 牛顿法迭代求新值
# 牛顿法对于导数为0的地方比较难跨越,是个缺陷
new_root = new_root - y/y_hat
count += 1
acc = abs(y)
print("final %d round is %.6f"%(count,new_root))
1 round is 4.000000
...
8 round is 1.694601
final 9 round is 1.694601
python二分法、牛顿法求根的更多相关文章
- MATLAB二分法函数求根
function xc = bisect(f,a,b,tol) ind = b-a; while ind > tol xx = (a+b)/; b = xx; else a = xx; end ...
- C语言复习---迭代法,牛顿迭代法,二分法求根
一:用迭代法求 x=√a.求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ...
- python练习:使用二分法查找求近似平方根,使用二分法查找求近似立方根。
python练习:使用二分法查找求近似平方根,使用二分法查找求近似立方根. 重难点:原理为一个数的平方根一定在,0到这个数之间,那么就对这之间的数,进行二分遍历.精确度的使用.通过最高值和最低值确定二 ...
- python牛顿法求一元多次函数极值
现在用牛顿法来实现一元函数求极值问题 首先给出这样一个问题,如果有这么一个函数$f(x) = x^6+x$,那么如何求这个函数的极值点 先在jupyter上简单画个图形 %matplotlib inl ...
- R语言求根
求根是数值计算的一个基本问题,一般采用的都是迭代算法求解,主要有不动点迭代法.牛顿-拉富生算法.割线法和二分法. 不动点迭代法 所谓的不动点是指x=f(x)的那些点,而所谓的不懂点迭代法是指将原方程化 ...
- [LeetCode] Sum Root to Leaf Numbers 求根到叶节点数字之和
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- 方程ax2+bx+c=0;一元二次方程。求根
<body>方程ax2+bx+c=0;一元二次方程.求根请输入a:<input type="number" id="a"/><br ...
- 说说用C语言求根的那些事儿
C语言--求根:计算机只识别0和1,那么问题来了,作为计算工具如何解决数学问题?其实,计算机是死东西,都是程序员用计算机的的思维去加数学公式计算数学题的.听起来好高端的样子,其实啊,也就那么回事儿, ...
- if 一元二次方程求根
if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...
随机推荐
- scrapy框架初识及使用
一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...
- 学习Tomcat(一)
一.jdk和tomcat基础 1.web应用对比 apache: 两种方式运行php,一是用模块,二是用fastcgi nginx: 通过fastcgi处理动态请求,也可转发到tomcat 2.tom ...
- 用一个文件,实现迷你 Web 框架
当下网络就如同空气一样在我们的周围,它以无数种方式改变着我们的生活,但要说网络的核心技术变化甚微. 随着开源文化的蓬勃发展,诞生了诸多优秀的开源 Web 框架,让我们的开发变得轻松.但同时也让我们不敢 ...
- carsim输入输出变量
来自:https://wenku.baidu.com/view/3405ded5443610661ed9ad51f01dc281e43a5673.html 输出量
- 标签页tab.js 在栏目之间切换,局部变化
1.在使用bootstrap 中,我们会用到在栏目之间切换,来刷新页面的局部,可以使用下面的方法 <link rel="stylesheet" href="http ...
- MySQL8.0官方文档学习
InnoDB架构 下面的架构里只挑选了部分内容进行学习 内存架构(In-Memory Structures) Buffer Pool Buffer Pool是内存中的一块区域,InnoDB访问表和索引 ...
- git的下载安装以及基本操作
版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...
- echarts中boundaryGap属性
boundaryGap:false boundaryGap:true 代码处: xAxis: { type: "category", data: ["06-01" ...
- 利用css3渐变效果实现圆环旋转效果
* { margin: 0; padding: 0; } .stage { width: 200px; height: 130px; margin: 100px auto; position: rel ...
- 计算机网络 TCP 四次挥手过程和状态变迁
客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态. 服务端收到该报文后,就向客户端发送 ACK 应答报 ...