The older the voters are, the less reliable they are. In their youngness, voters are more reliable than single components. The goal of this example is to find when a voter starts to be less reliable than a single component.
Let’s start with a simple 2/3 voters. It’s really easy to get its reliability. First, we have to import the functions and classes we will use.
>>> from fiabilipy import Voter, Component
>>> from sympy import Symbol
Let’s build the voter, with an unknown reliability \(\lambda\).
>>> l = Symbol('l', positive=True, null=False) #Lambda
>>> t = Symbol('t', positive=True) #our time variable
>>> comp = Component('C', l)
>>> voter = Voter(comp, 2, 3)
Here is the voter, now let’s get its reliability.
>>> voter.reliability(t)
3.0*(1 - exp(-l*t))*exp(-2*l*t) + 1.0*exp(-3*l*t)
To have a polynomial expression, we substitute \(\exp(-\lambda t)\) to \(x\). Once more, this is easy in python…
>>> from sympy import exp
>>> x = Symbol('x')
>>> voter.reliability(t).subs(exp(-l*t), x).nsimplify()
x**3 + 3*x**2*(-x +1)
Using this notation, the reliability of a single component is \(x\). So to find when the given voter is equivalent to the single component, we simply have to solve \(x^3 + 3x^2(-x + 1) - x = 0\).
>>> from sympy import solve
>>> crossing = (voter.reliability(t) - comp.reliability(t)).nsimplify()
>>> solve(crossing.subs(exp(-l*t), x))
[0, 1/2, 1]
And, the task is done.
The code below gives a generic function to solve this problem.
from fiabilipy import Voter, Component
from sympy import Symbol, solve, exp
def voterintersection(M, N):
assert 1 < M < N, 'the given voter is not real'
l = Symbol('l', positive=True, null=False)
t = Symbol('t', positive=True)
x = Symbol('x')
comp = Component('C', l)
voter = Voter(comp, M, N)
crossing = (voter.reliability(t) - comp.reliability(t)).nsimplify()
roots = solve(crossing.subs(exp(-l*t), x))
return roots