二分法求根

思路:对于一个连续函数,左值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二分法、牛顿法求根的更多相关文章

  1. MATLAB二分法函数求根

    function xc = bisect(f,a,b,tol) ind = b-a; while ind > tol xx = (a+b)/; b = xx; else a = xx; end ...

  2. C语言复习---迭代法,牛顿迭代法,二分法求根

    一:用迭代法求 x=√a.求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ...

  3. python练习:使用二分法查找求近似平方根,使用二分法查找求近似立方根。

    python练习:使用二分法查找求近似平方根,使用二分法查找求近似立方根. 重难点:原理为一个数的平方根一定在,0到这个数之间,那么就对这之间的数,进行二分遍历.精确度的使用.通过最高值和最低值确定二 ...

  4. python牛顿法求一元多次函数极值

    现在用牛顿法来实现一元函数求极值问题 首先给出这样一个问题,如果有这么一个函数$f(x) = x^6+x$,那么如何求这个函数的极值点 先在jupyter上简单画个图形 %matplotlib inl ...

  5. R语言求根

    求根是数值计算的一个基本问题,一般采用的都是迭代算法求解,主要有不动点迭代法.牛顿-拉富生算法.割线法和二分法. 不动点迭代法 所谓的不动点是指x=f(x)的那些点,而所谓的不懂点迭代法是指将原方程化 ...

  6. [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 ...

  7. 方程ax2+bx+c=0;一元二次方程。求根

    <body>方程ax2+bx+c=0;一元二次方程.求根请输入a:<input type="number" id="a"/><br ...

  8. 说说用C语言求根的那些事儿

    C语言--求根:计算机只识别0和1,那么问题来了,作为计算工具如何解决数学问题?其实,计算机是死东西,都是程序员用计算机的的思维去加数学公式计算数学题的.听起来好高端的样子,其实啊,也就那么回事儿, ...

  9. if 一元二次方程求根

    if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...

随机推荐

  1. Spring Framework 中有多少个模块,它们分别是什么?

    Spring 核心容器 – 该层基本上是 Spring Framework 的核心.它包含以下模块: Spring Core Spring Bean SpEL (Spring Expression L ...

  2. 有哪些不同类型的 IOC(依赖注入)方式?

    构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现 的,该类有一系列参数,每个参数代表一个对其他类的依赖.Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 st ...

  3. mysql的cpu飙升原因及处理

     Mysql 批量杀死进程 正常情况下kill id,即可,但是有时候某一异常连接特别多的时候如此操作会让人抓狂,下面记录下小方法: use information_schema; select co ...

  4. shell脚本编程(一) 变量、条件判断、循环

    目录   1. shell脚本编程   2. 运行 Shell 脚本有两种方法   3. 变量   4. 本地变量   5. 环境变量   6. 参数变量   7. 多行注释   8. if条件判断 ...

  5. Altium design16设计技巧

    第一栏:共有界面 1.在原理图和PCB都打开的情况下,选中原理图可以对应到PCB界面元件里面 第二栏:原理图界面 1.批量改变元件属性 选择某一元件-查找相似对象-将其要改变的内容设置为same-点击 ...

  6. 探索前端黑科技——通过 png 图的 rgba 值缓存数据

    本文系原创,欢迎转载,转载请注明作者信息项目地址:SphinxJS在线体验地址:https://jrainlau.github.io/sp... 说起前端缓存,大部分人想到的无非是几个常规的方案,比如 ...

  7. ES6-11学习笔记--正则表达式的扩展

    y修饰符 u修饰符   复习以前的修饰符: i(忽略大小写) m(多行匹配) g(全局匹配)   y修饰符:粘连修饰符 const str = 'aaa_aa_a' const reg1 = /a+/ ...

  8. sql server学习总结一

    一,数据库的三级模式结构 1.    模式 模式又称逻辑模式或者概念模式,是数据库中全体数据的逻辑结构和特征的描述,一个数据库只有一个模式,模式处于三级结构的中间层. 2.    外模式 外模式又称用 ...

  9. 适配手机端rpx像素

    <script src="static/js/adaptive.js"></script> <script type="text/javas ...

  10. SpringMVC-组件分析之视图解析器(prefix,suffix)

    SpringMVC的默认组件都是在DispatcherServlet.properties配置文件中配置的: spring-webmvc->org/springframewrok/web/ser ...