如何提升Python迭代计算代码精度以复现数学点云图?
迭代函数点云绘制的问题修复
你遇到的核心问题并非单纯的精度不足,而是变量更新顺序错误:计算新的y时,你使用了已经更新过的x值,而非迭代前的原始x,这直接导致迭代逻辑偏离原公式,进而提前进入循环。此外,可通过提升数值精度进一步避免舍入误差。
修复步骤
1. 修正变量更新顺序
迭代时需要先保存原始的x和y值,再用原始值计算新的x和y:
import matplotlib.pyplot as plt x = 0.0 y = 0.0 vecx = [] vecy = [] for i in range(5000): # 保存当前迭代的原始x、y值 old_x = x old_y = y # 用原始值计算新的x和y x = 1.3 + 0.3*old_x + 0.6*old_x*old_y - 0.6*old_y - old_y**2 y = 0.1 - 0.7*old_x + 0.5*(old_x**2) - 0.8*old_x*old_y + 0.1*old_y - 0.6*(old_y**2) vecx.append(x) vecy.append(y) plt.plot(vecx, vecy, 'b.', markersize=1) plt.show()
2. 提升数值精度(可选)
如果仍担心舍入误差,可使用Python的decimal模块设置更高精度的浮点数计算:
import matplotlib.pyplot as plt from decimal import Decimal, getcontext # 设置精度为50位小数 getcontext().prec = 50 x = Decimal('0.0') y = Decimal('0.0') vecx = [] vecy = [] for i in range(5000): old_x = x old_y = y x = Decimal('1.3') + Decimal('0.3')*old_x + Decimal('0.6')*old_x*old_y - Decimal('0.6')*old_y - old_y**2 y = Decimal('0.1') - Decimal('0.7')*old_x + Decimal('0.5')*(old_x**2) - Decimal('0.8')*old_x*old_y + Decimal('0.1')*old_y - Decimal('0.6')*(old_y**2) vecx.append(float(x)) vecy.append(float(y)) plt.plot(vecx, vecy, 'b.', markersize=1) plt.show()
说明
修正变量更新顺序后,迭代逻辑将严格遵循原公式,即可生成预期的复杂点云。decimal模块的高精度计算可进一步减少迭代过程中的舍入误差,适合对精度要求极高的场景。
内容的提问来源于stack exchange,提问作者Dessie
相关产品推荐
相关产品推荐

