Compute yield to maturity for a bond with coupons when price is different from face value Given the formula  $P = \sum_{t=1}^n \frac{CF_t}{(1+i)^t} $ 
 we can apply it to the case of a bond with constant coupons so that : 

$\displaystyle P =\sum_{t=1}^n \frac{C}{(1+i)^t} + \frac{FV}{(1+i)^n}  \implies P = C(\frac{1-(1+i)^{-n}}{i})+\frac{FV}{(1+i)^n}$  

with  $P$ = price , $C$ = coupon at the time $t$ , $FV$ = face value , $i$ = yield to maturity

My problem : How is it estimated $i$ when $P\neq FV$ and $P, C,FV$ are known ? 

I think that it's not possible to obtain an exact result , because it doesn't seem possible to separate the $i$ from the rest . I tried to use Taylor formulas somehow to get an approximation but I haven't come to anything. 

EDIT :

Is bisection method the only possible way to proceed ? Is something about polynomial approximation possible?
Following the suggestion by Brian Romanchuk of the 'quick and dirty' bisection method in the comments, I wrote this python program to estimate the yield to maturity :

def find_i(P, C, FV, n, epsilon):

    if P &gt; FV : i_min, i_max = 0 , C / FV 
    elif P &lt; FV : i_min, i_max = C / FV , 10
    else : return C / FV

    while True :

        i_mid = ( i_max + i_min ) / 2 # mid point of the current intervall 
        point = C*(1-(1+i_mid)**(-n))/i_mid + FV/(1+i_mid)**n - P # it should converge to 0

        if abs(point) &lt; epsilon  : return i_mid # if point is close enough to 0 then finish

        if point &gt; 0 : i_min = i_mid # [i_mid,i_max] : new intervall
        elif point &lt; 0 : i_max = i_mid # [i_min,i_mid] : new intervall

P, C, FV, n = 1100, 100, 1000, 10
epsilon = 10**-5
i = find_i(P, C, FV, n, epsilon)


The choice of $i_{min}$ and $i_{max}$ is important to estimate $i$ in edge cases.
Dealing with negative interest is harder.

I'm going to update the method to improve the computation , for now I list the relavant facts used :

1) When $P = FV $ then $i = C / FV$

2) $P$ and $i$ are negative correlated when $i&gt;0$