请详细回答word里的两道上机题中的几个问题,要求代码用python实现
时间: 2024-12-18 22:30:46 浏览: 49
好的,我将根据文档内容详细回答这两道上机题,并提供相应的Python代码实现。
### 上机题1:截断误差和有效数字
#### 背景
题目要求编制两个通用程序,分别按照从大到小和从小到大的顺序计算 \( S_N \),并比较结果的有效位数。假设 \( S_N = \sum_{i=1}^N \frac{1}{i} \)。
#### (1) 编制按从大到小的顺序计算 \( S_N \) 的通用程序
```python
def sum_large_to_small(N):
S = 0.0
for i in range(1, N + 1):
S += 1 / i
return S
# 示例
N = 1000
result_large_to_small = sum_large_to_small(N)
print(f"Sum from large to small: {result_large_to_small}")
```
#### (2) 编制按从小到大的顺序计算 \( S_N \) 的通用程序
```python
def sum_small_to_large(N):
S = 0.0
for i in range(N, 0, -1):
S += 1 / i
return S
# 示例
N = 1000
result_small_to_large = sum_small_to_large(N)
print(f"Sum from small to large: {result_small_to_large}")
```
#### (3) 按两种顺序分别计算 \( S_{1000} \),并指出有效位数
```python
import math
# 计算S_1000
N = 1000
result_large_to_small = sum_large_to_small(N)
result_small_to_large = sum_small_to_large(N)
# 输出结果
print(f"Sum from large to small: {result_large_to_small}")
print(f"Sum from small to large: {result_small_to_large}")
# 计算有效位数
def count_significant_digits(a, b):
diff = abs(a - b)
if diff == 0:
return len(str(a))
else:
significant_digits = -int(math.floor(math.log10(diff))) - 1
return max(significant_digits, 0)
significant_digits = count_significant_digits(result_large_to_small, result_small_to_large)
print(f"Number of significant digits: {significant_digits}")
```
#### (4) 通过本次上机题,你明白了什么?
- **浮点数运算的不稳定性**:不同顺序的加法可能会导致不同的结果,特别是在处理大量项时。
- **有效位数的重要性**:了解有效位数可以帮助评估数值计算的准确性。
- **编程实践**:通过编写程序来验证数学概念,加深对数值分析的理解。
### 上机题2:非线性方程求解
#### 背景
题目要求使用牛顿法解方程 \( f(x) = 0 \),并给出具体方程 \( f(x) = x^3 - x - 1 \)。已知该方程有三个根。
#### (1) 确定尽可能大的 \( \delta \)
牛顿法的局部收敛性表明,存在一个 \( \delta > 0 \),使得当初始值 \( x_0 \) 在 \( [x_2^* - \delta, x_2^* + \delta] \) 内时,牛顿迭代序列收敛于根 \( x_2^* \)。我们可以通过试验找到这个 \( \delta \)。
```python
def newton_method(f, df, x0, tol=1e-6, max_iter=1000):
x = x0
for _ in range(max_iter):
fx = f(x)
if abs(fx) < tol:
return x
dfx = df(x)
if dfx == 0:
raise ValueError("Derivative is zero. No solution found.")
x -= fx / dfx
raise ValueError("Maximum number of iterations reached. No solution found.")
def f(x):
return x**3 - x - 1
def df(x):
return 3*x**2 - 1
# 确定delta
x_star = 1.324717957244746 # 已知的一个根
delta = 0.1
while True:
try:
x0 = x_star + delta
root = newton_method(f, df, x0)
if abs(root - x_star) < 1e-6:
delta *= 1.1
else:
break
except ValueError:
break
delta = delta / 1.1
print(f"Largest delta: {delta}")
```
#### (2) 观察不同初始值下的收敛性
```python
initial_values = [-2, -1, 0, 1, 2]
roots = []
for x0 in initial_values:
try:
root = newton_method(f, df, x0)
roots.append((x0, root))
except ValueError as e:
print(e)
for x0, root in roots:
print(f"Initial value: {x0}, Converged to root: {root}")
```
#### (3) 通过本上机题,你明白了什么?
- **牛顿法的局部收敛性**:牛顿法在接近根的初始值附近具有很好的收敛性。
- **选择合适的初始值**:不同的初始值可能导致收敛到不同的根或不收敛。
- **编程实践**:通过编写程序来实现和测试数值算法,可以更好地理解其特性和局限性。
希望这些解答对你有所帮助!如果有任何进一步的问题,请随时提问。
阅读全文
相关推荐

















