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 。
- 原代码因序列发散会输出‘No convergence’。
- 将
if not abs(u - uold) > 1.e-8替换为if abs(u - uold) < 1.e-8,逻辑等价,仍输出‘No convergence’。 - 将
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]:

最低0.47元/天 解锁文章
2423

被折叠的 条评论
为什么被折叠?



