# -*- coding: utf-8 -*-
# Created on Wed May 21 08:08:08 2025
# @author: mhebding
# DM2py - Recherche d un zero



## I - La methode de dichotomie

K = 10**-4.8
C0 = 0.1

# 1.
def polynome(x):
    a = 1
    b = K
    c = -K*C0
    return a*x**2 + b*x + c

# 2.
def delta(K,C0):
    return K**2+4*K*C0

# 3.
def racine(K,C0):
    assert delta(K,C0) >= 0
    x1 = 0.5*(-K+delta(K,C0)**0.5)
    x2 = 0.5*(-K-delta(K,C0)**0.5)
    if x1<0:
        solution = x2
    elif x1>C0:
        solution = x2
    else:
        solution = x1
    return solution

# 4.
def dichotomie(f, a, b, epsilon):
    m = (a + b)/2.
    while b - a > epsilon:
        if f(m) == 0:
            return m
        elif f(a)*f(m) > 0:
            a = m
        else: # revient a  f(a)*f(m) < 0
            b = m
        m = (a + b)/2
    return m

# 5.
def test1():
    print("")
    print("I - Recherche de xeq en chimie")
    solution1 = racine(K,C0)
    print("Par discriminant : " + str(round(solution1,10)))
    epsilon = 10**-7
    solution2 = dichotomie(polynome, 0, 0.1, epsilon)
    print("Par dichotomie (epsilon=" +str(epsilon) + ") : " + str(round(solution2,10)))
    


# II - La methode de Newton

import sympy as sp 
m = 1000 # kg
C = 400*10**9 # SI
G = 6.67*10**-11 # SI
M = 6*10**24 # kg

r = sp.Symbol('r') 
Epeff = 1/2*m*C**2/r**2 - G*m*M/r
dEpeff = sp.diff(Epeff,r) # calcul derivee
dEpeff2 = sp.diff(dEpeff,r) # derivee de la derivee

fonction, fonction2=sp.lambdify(r, dEpeff), sp.lambdify(r, dEpeff2) # conversion en fonctions

# 6.
def newton(f, df, x0, e, Nmax=100):
    n = 1
    u = x0
    v = u - f(u) / df(u) # v = u_n+1
    while abs (u - v) >= e:
        u, v = v, v - f(v) / df(v)
        n += 1
        if n > Nmax:
            return None
    return v

# 7.
def test2():
    print("")
    print("II - Recherche de r0 en meca")
    epsilon = 10**-7
    print("Par theorie conique r0 : "+ str(round(C**2/(G*M),2)))
    solution2 = newton(fonction, fonction2, 100, epsilon)
    print("Par Newton (epsilon=" +str(epsilon) + ") : " + str(round(solution2,2)))

#>>> test1()
#>>> test2()