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... ...
随机推荐
- idea-中的Mark Diretory as的内容
Sources Root:告诉idea这个文件夹及其子文件夹中包含源代码,是需要编译构建的一部分 Test Sources Root:测试源文件夹允许您将与测试相关的代码与生产代码分开.通常,源和测试 ...
- 什么是持续集成(CI)?
持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程. 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试.
- 学习RabbitMQ(五)
消息中间件就是在消息的传输过程中保存消息的容器.消息中间件再将消息从它的源中继到它的目标时充当中间人的作用.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用,消息队列会保留消息,直 ...
- 攻防世界 web_php_include
Web_php_include 进入题目源码直接出来了 <?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page'] ...
- css写作建议和性能优化小结
1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,cs ...
- html5知识点补充—mark元素的使用
使用mark元素高亮文本 利用mark元素,文档作者可以高亮显示文档中的某些文本以达到醒目的效果. 如果用户在站点进行搜索,搜索页面中的关键字可以高亮显示.这时,就可以很好的利用到mark元素.不选用 ...
- 在小程序中Tabbar显示和隐藏的秘密
其实对Tabbar 的用法的理解总结下来分这几个阶段: 第一阶段:在 app.json 中配置 "tabBar": { "list": [{ "pag ...
- JavaScript 工作原理之三-内存管理及如何处理 4 类常见的内存泄漏问题(译)
原文请查阅这里,本文有进行删减,文后增了些经验总结. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第三章. 我们将会讨论日常使用中另一个被开发者越来越忽略的 ...
- 【Android开发】【布局】 仿微信UI
Demo地址
- phpstorm配置xdebug 3.0最新教程!!!配置不成功的快看!
前言 之前2月份就开始配置xdebug,始终没有成功. 今天看到一篇写得挺详细的文章,心血来潮又折腾了下,可惜没成功. 验证始终说我配置错误 后面去阅读官方的文档,修改了些配置,居然搞成功了!! ni ...