是否可以在任何 Python 求解器中 运行 for 循环?

Is it possible to run a for loop within any Python solvers?

我正在尝试寻找只有一个未知数的可靠性工程非线性问题的解决方案。这应该相对容易;然而,我遇到的问题是在等式的求和部分。到目前为止,我的研究使我相信 运行 在 Python.

中的求解器中的 for 循环是不可能的

我要解的方程是: Equation

该等式考虑了简单可靠性测试的结果。一些方程变量包含在列表中,而其他变量是单个标量。等式变量是:

d = "fix effectiveness factor",将通过纠正措施减轻的故障模式故障率的分数

v = 测试期间应用纠正措施的时间

n = 在测试期间针对每种故障模式观察到的故障数

m = 出现的故障模式总数

T = 总测试时间(在这种情况下,测试 25 个单元 175 小时 = 4375 小时)。

我正在尝试求解 beta_hat 的方程式。我已经使用其他 methods/software 来求解方程并且我知道 beta_hat = 0.0016,但是,我需要使用 Python 来求解这个方程,因为这是我用于所有其他代码的。

保存每个等式元素值的列表是:

d = [0.5, 0., 0., 0., 0.8, 0., 0.7, 0.8, 0.5, 0.5, 0.5, 0., 0.]
v = [4375., 0., 0., 0., 4375., 0., 4375., 2500., 4375., 4375., 4375., 0., 0.]
n = [1, 3, 16, 2, 1, 4, 1, 3, 1, 1, 1, 8, 1]
m = 13
T = 4375

我尝试使用 scipy.optimize(fsolve、root、least_squares)但没有成功,但我开始 运行 没有想法,我认为问题可能在于我不能在 Python 的求解器中 运行 for 循环,就像这个例子:

def f(x):
    for i in range(m):
        ((1 + x * T) / (x**2 * T)) * math.log(1 + x * T) * np.sum(n[i] / (1 / x + v[i] + (1 - d[i]) * (T - v[i]))) - m
    return f

result = optimize.root(f, 0.01)
print(result)

关于我如何解决这个问题的任何 suggestions/ideas? 运行 求解器外部的 for 循环是否有我想念的方法?

正如我在评论中提到的,您的 f() 不会计算求解器要使用的数字。它似乎也没有实现您链接到的方程式。这是一个完整的程序,包括一个自制的玩具求解器:

def bisect(f, lo, hi, numiters):
    assert f(lo) < 0.0
    assert f(hi) > 0.0
    for _ in range(numiters):
        mid = lo + (hi - lo) / 2.0
        y = f(mid)
        if y < 0.0:
            lo = mid
        else:
            hi = mid
    return lo

d = [0.5, 0., 0., 0., 0.8, 0., 0.7, 0.8, 0.5, 0.5, 0.5, 0., 0.]
v = [4375., 0., 0., 0., 4375., 0., 4375., 2500., 4375., 4375., 4375., 0., 0.]
n = [1, 3, 16, 2, 1, 4, 1, 3, 1, 1, 1, 8, 1]
m = 13
T = 4375

def f(x):
    from math import log
    s = 0.0
    for i in range(m):
        s += n[i] / (1.0 / x + v[i] + (1.0 - d[i]) * (T - v[i]))
    return s * ((1.0 + x * T) / (x**2 * T)) * log(1.0 + x * T) - m

鉴于:

>>> f(5)
-12.979641343531911
>>> f(0.001)
3.975686546173577
>>> bisect(f, 5, 0.001, 53)
0.0016334432920776716

这似乎与您期望的答案 0.0016 匹配。

所以想想这一切:问题几乎肯定不在您尝试使用的求解器中,而是在您传递给它们的函数中。

鉴于 Tim 的评论和反馈,我修改了我的代码并使用 solve 和 root 检查了答案。两种努力都产生了相同的结果(如预期)。

from math import log
from scipy.optimize import solve, root

d = [0.5, 0., 0., 0., 0.8, 0., 0.7, 0.8, 0.5, 0.5, 0.5, 0., 0.]
v = [4375., 0., 0., 0., 4375., 0., 4375., 2500., 4375., 4375., 4375., 0., 0.]
n = [1, 3, 16, 2, 1, 4, 1, 3, 1, 1, 1, 8, 1]
m = 13
T = 4375

def f(x):
    c = 0.0
    for i in range(m):
        c += n[i] / (1.0 / x + v[i] + (1.0 - d[i]) * (T - v[i]))
    return ((1.0 + x * T) / (x**2 * T)) * log(1.0 + x * T) * c - m

这导致

>>> fsolve(f, 0.001)
array([0.00163344])
>>> root(f, 0.001)
x: array([0.00163344])