Python编程与数值计算练习解析

1、假设我们要检查一个发散序列的收敛性(这里序列由递推关系$u_{n + 1} = 2u_n$且$u_0 = 1.0$定义):代码如下: pythonu = 1.0 # 这里必须使用浮点数!uold = 10.for iteration in range(2000): if not abs(u - uold) > 1.e-8: print('Convergence') break # 序列已收敛 uold = u u = 2 * uelse: print('No convergence') 由于该序列不收敛,代码应输出‘No convergence’消息。运行代码查看结果。如果将 if not abs(u - uold) > 1.e-8 替换为 if abs(u - uold) < 1.e-8 ,会发生什么?再次运行代码查看结果。如果将 u = 1.0 替换为 u = 1 (不带小数点),会发生什么?运行代码验证你的预测。解释这段代码的意外行为。理解发生了什么的关键是 inf 会被评估为 nan ,并且 nan 与任何其他值的比较总是返回 False

  1. 原代码因序列发散会输出‘No convergence’。
  2. if not abs(u - uold) > 1.e-8 替换为 if abs(u - uold) < 1.e-8 ,逻辑等价,仍输出‘No convergence’。
  3. u = 1.0 替换为 u = 1 ,可能因整数运算在数值过大时出现意外,关键在于 inf 会变成 nan nan 参与比较总返回 False

2、蕴含关系 C = (A ⇒ B) 是一个布尔表达式,定义为:若 A 为假,或者 A 和 B 都为真,则 C 为真;否则 C 为假。请编写一个 Python 函数 implication(A, B)。

根据蕴含关系的定义,可以编写如下 Python 函数:

def implication(A, B):
  return (not A) or (A and B)

3、本次练习旨在训练布尔运算。使用一种名为半加器的逻辑设备对两个二进制位进行相加。它会产生一个进位位(更高一位的值)和和值,半加器运算的定义如下表所示:

p q 和值 进位
1 1 0 1
1 0 1 0
0 1 1 0
0 0 0 0
全加器由两个半加器组成,用于对两个二进制位和一个额外的输入进位位进行求和。编写一个实现半加器的函数和一个实现全加器的函数,并对这些函数进行测试。
以下是Python实现半加器和全加器的代码示例:
# 半加器函数
# 输入两个二进制位p和q,返回和值和进位
def half_adder(p, q):
    sum_bit = p ^ q  # 异或运算得到和值
    carry_bit = p & q  # 与运算得到进位
    return sum_bit, carry_bit

# 全加器函数
# 输入两个二进制位a和b以及一个进位cin,返回和值和进位
def full_adder(a, b, cin):
    # 第一个半加器计算a和b的和与进位
    s1, c1 = half_adder(a, b)
    # 第二个半加器计算s1和cin的和与进位
    sum_bit, c2 = half_adder(s1, cin)
    # 最终进位是c1和c2的或运算结果
    carry_bit = c1 | c2
    return sum_bit, carry_bit

# 测试半加器
print("半加器测试:")
for p in [0, 1]:
    for q in [0, 1]:
        sum_bit, carry_bit = half_adder(p, q)
        print(f"输入: p={p}, q={q}, 输出: 和值={sum_bit}, 进位={carry_bit}")

# 测试全加器
print("全加器测试:")
for a in [0, 1]:
    for b in [0, 1]:
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值