误差的处理

误差

  • 误差无处不在
    • 有效位丢失
    • 化整误差
    • 尾数丢失
  • 分数法
    • 代码
  • 十进制法
    • 代码
  • 验证
  • a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0
    • x = − b ± b 2 − 4 a c 2 a x ={-b \pm \sqrt{b^2-4ac}\over 2a} x=2ab±b24ac
    • 分数法
    • 十进制法
    • sympy
    • 验证

误差无处不在

误差的处理Python计算小数的误差
>>> 0.1+0.1
0.2
>>> _+0.1
0.30000000000000004
>>> 

有效位丢失

大小基本相同的数值相减,由于丢失有效数字而引起的误差。

化整误差

运用有效位数的二进制表示实数所产生的误差。上面图片的例子就是这种情况。

尾数丢失

绝对值相差较大的数值进行运算时,绝对值小的数未被反应到计算结果中而产生的误差。

分数法

使用通约分模块,直接作为分数进行运算,避免小数表示产生的化整误差。

代码

from fractions import Fraction
print(“通约分模块”,Fraction(1,10)+Fraction(1,10)+Fraction(1,10))#通约分模块
#print(Fraction(5,10),Fraction(3,5)) #5/10的3/15的约分
#print(Fraction(1,3)+Fraction(1,7)) #1/3+1/7
#print(Fraction(5,3)*Fraction(6,7)*Fraction(3,2))

十进制法

使用十进制计算模块可以避免二进制浮点数计算产生的误差。

代码

from decimal import *
print(“十进制计算模块”,Decimal(“0.1”)+Decimal(“0.1”)+Decimal(“0.1”)) #十进制计算模块

验证

通约分模块 3/10
十进制计算模块 0.3
从结果来看分数法和十进制方法是对的,处理掉了误差。

a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0

前面文章递归调用——单向汉诺塔里说要说一下Python解方程。这里来解二元一次方程,看看不同的方式产生的误差情况。

x = − b ± b 2 − 4 a c 2 a x ={-b \pm \sqrt{b^2-4ac}\over 2a} x=2ab±b24ac

直接用解的公式。

import math
def fun(a,b,c):
    x1 = (0-b+math.sqrt(b*b-4*a*c))/(2*a)
    x2 = (0-b-math.sqrt(b*b-4*a*c))/(2*a)
    return x1,x2
    
print("math解方程",fun(3,4,1))
#fun(3,4,5)不能对负数开方,即使是奇数次方

测试3,4,5还不行,就用a=3,b=4,c=1测试。

分数法

def functin(a,b,c):
    x1 = Fraction((0-b+math.sqrt(b*b-4*a*c)),(2*a))
    x2 = Fraction((0-b-math.sqrt(b*b-4*a*c)),(2*a))
    return x1,x2
#both arguments should be Rational instances
#print(functin(3,4,1))

十进制法

def f(a,b,c):
    x1 = Decimal(0-b+math.sqrt(b*b-4*a*c))/Decimal(2*a)
    x2 = Decimal(0-b-math.sqrt(b*b-4*a*c))/Decimal(2*a)
    return x1,x2
print("Decimal解方程",f(3,4,1))

sympy

from sympy import symbols, solve
def fsympy(a,b,c):
    x = symbols('x')
    print("sympy解方程",solve(a * x**2 + b*x + c, x))
fsympy(3,4,1)

验证

=================== RESTART: C:/Program Files/Python38/误差.py ===================
math解方程 (-0.3333333333333333, -1.0)
Decimal解方程 (Decimal(’-0.3333333333333333333333333333’), Decimal(’-1’))
sympy解方程 [-1, -1/3]

从结果来看用sympy最好。不过十进制方法里只把除法运算加了Decimal转换,里面的乘法和减法没有转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值