算法---解决“非线程方程组”问题

import math


def takeStep(Xcur):
    """
    根据当前变量值计算下一步的变量值。

    该函数接收一个长度为3的列表,表示当前各个变量的取值情况,
    通过特定的数学表达式计算出下一步各个变量对应的新值,
    并以长度为3的列表形式返回这些新值。

    参数:
    Xcur (list): 长度为3的列表,代表当前的变量取值情况,例如 [x1, x2, x3] 的形式,
                 其中每个元素对应不同的变量当前取值。

    返回:
    list: 长度为3的列表,为经过计算得到的下一步变量取值,
          按照同样的顺序依次存放更新后的各个变量值。
    """
    Xnex = [0, 0, 0]  # 初始化一个长度为3的列表,用于存放下一步的变量值,初始值都设为0

    # 根据给定的数学表达式计算第一个变量的下一步取值
    # 这里使用了数学库中的余弦函数(math.cos)以及基本的算术运算,
    # 通过当前变量 Xcur 中的第二个和第三个变量值的乘积作为余弦函数的参数进行计算,
    # 然后除以3.0并加上1.0 / 6得到新值,赋给 Xnex 的第一个元素。
    Xnex[0] = math.cos(Xcur[1] * Xcur[2]) / 3.0 + 1.0 / 6

    # 按照另一个数学表达式计算第二个变量的下一步取值
    # 先计算根号内的表达式,涉及到当前变量 Xcur 的第一个变量值的平方、
    # 第三个变量对应的正弦函数值(math.sin)以及一个常数 1.06 的求和,
    # 然后将这个和开根号后除以9.0再减去0.1,得到的结果赋给 Xnex 的第二个元素。
    Xnex[1] = math.sqrt(Xcur[0] * Xcur[0] + math.sin(Xcur[2]) + 1.06) / 9.0 - 0.1

    # 依据第三个数学表达式计算第三个变量的下一步取值
    # 使用了数学库中的指数函数(math.exp),先计算当前变量 Xcur 中第一个和第二个变量值的乘积的相反数作为指数函数的参数,
    # 对其取指数后除以20.0,再减去一个包含圆周率(math.pi)的常数表达式 (10 * math.pi - 3) / 60,
    # 最后将得到的结果赋给 Xnex 的第三个元素。
    Xnex[2] = -math.exp(-Xcur[0] * Xcur[1]) / 20.0 - (10 * math.pi - 3) / 60

    return Xnex


def initialize():
    """
    初始化变量的初始值。

    该函数用于设定迭代过程开始时各个变量的初始取值,
    返回一个包含三个初始值的列表,作为整个迭代算法的起始状态。

    返回:
    list: 包含三个初始值的列表,作为迭代的起始状态,这里固定返回 [0.1, 0.1, -0.1],
          可根据实际需求修改这些初始值。
    """
    X0 = [0.1, 0.1, -0.1]
    return X0


def calculateDistance(Xcur, Xnew):
    """
    计算两个三维向量之间的欧几里得距离。

    该函数接收两个长度为3的列表,分别代表两个三维向量,
    通过计算对应元素差值的平方和再开根号的方式,得到这两个向量之间的欧几里得距离。

    参数:
    Xcur (list): 长度为3的列表,代表第一个向量,例如 [x1, x2, x3] 的形式,
                 每个元素对应向量在相应维度上的坐标值。
    Xnew (list): 长度为3的列表,代表第二个向量,与 Xcur 结构相同,用于和 Xcur 向量作比较。

    返回:
    float: 两个向量之间的距离值,表示它们在三维空间中的差异程度,
           距离越小说明两个向量越接近。
    """
    temp = [Xcur[0] - Xnew[0], Xcur[1] - Xnew[1], Xcur[2] - Xnew[2]]
    # 计算两个向量对应元素差值的平方和
    # 先分别计算每个维度上差值的平方,即 temp[0] ** 2、temp[1] ** 2、temp[2] ** 2,
    # 然后将这三个平方值相加,得到差值的平方和。
    sum_of_squares = temp[0] ** 2 + temp[1] ** 2 + temp[2] ** 2
    # 对差值的平方和开根号,得到欧几里得距离
    dis = math.sqrt(sum_of_squares)
    return dis


def iteration(eps, maxIter):
    """
    执行迭代过程,根据给定的精度要求和最大迭代次数进行计算,并输出每次迭代的相关信息。

    该函数整合了前面几个函数的功能,通过不断调用 takeStep 函数来更新变量值,
    使用 calculateDistance 函数来判断相邻两次迭代结果的接近程度,
    在满足精度要求(距离小于 eps)或者达到最大迭代次数之前,持续进行迭代,
    并在每次迭代时打印出当前的迭代次数以及各个变量的值和相邻两次迭代的距离(eps 值)。

    参数:
    eps (float): 收敛精度,当相邻两次迭代结果的距离小于此值时,认为迭代收敛,
                  即达到了足够接近的程度,可以停止迭代。
    maxIter (int): 允许的最大迭代次数,主要是为了防止迭代过程不收敛而陷入无限循环,
                   如果迭代次数达到这个最大值仍未满足收敛精度要求,也会停止迭代。

    返回:
    int: 返回0表示迭代正常结束(可按需修改返回值的含义),例如可以根据是否真正收敛等情况返回不同的值来区分不同的结束状态。
    """
    cur_eps = 10000  # 初始化当前的距离值为一个较大的数,用于首次进入循环判断
    Xcur = initialize()  # 获取变量的初始值,作为迭代的起始状态
    Xnew = [0, 0, 0]  # 初始化一个用于存放下一步迭代结果的列表,初始值都设为0
    iterNum = 1  # 初始化迭代次数为1,表示即将进行第一次迭代

    print("---  --开始迭代-----==----")
    print(" 迭代次数  Xk1  Xk2  Xk3  eps")
    while cur_eps > eps and iterNum < maxIter:
        # 调用 takeStep 函数,根据当前变量值 Xcur 计算得到下一步的变量值,赋值给 Xnew
        Xnew = takeStep(Xcur)
        # 调用 calculateDistance 函数,计算当前变量值 Xcur 和下一步变量值 Xnew 之间的距离,得到当前的距离值 cur_eps
        cur_eps = calculateDistance(Xcur, Xnew)
        # 按照指定格式输出当前的迭代次数、各个变量的值以及当前相邻两次迭代的距离(eps 值),
        # 其中使用了格式化字符串,%d 表示整数占位符(对应迭代次数 iterNum),%.8f 表示浮点数占位符并保留8位小数,
        # 依次对应 Xcur 中的各个变量值以及 cur_eps 的值,通过元组 (iterNum, Xcur[0], Xcur[1], Xcur[2], cur_eps) 传递具体参数进行格式化输出。
        print(" %d %.8f %.8f %.8f %.8f" % (iterNum, Xcur[0], Xcur[1], Xcur[2], cur_eps))
        iterNum += 1  # 迭代次数加1,准备进行下一次迭代
        Xcur = Xnew  # 将下一步的变量值赋值给当前变量值,用于下一次迭代的计算基础
    return 0  # 迭代结束后,返回0表示迭代正常结束(可根据实际需求调整返回值的含义)


iteration(10 ** -10, 200)

返回结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luky!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值