3260 - Invers
Cerința
Veșnicul Gigel vrea să dea la Facultatea de Informatică din Iași pentru că e #ceaMaiTare. De asta s-a apucat de probleme pe pbinfo și a dat peste următoarea problema ce i-a plăcut atât de mult încât vă provoacă și pe voi să o rezolvați:
Se dă funcția f(x)=sin(x) + sin(2*x) + x și o valoare y. Știind că funcția este strict crescătoare pe intervalul [0,1), se cere să se gasească pentru ce x∈[0,1) avem că f(x)≈y (aproximare cu 8 zecimale).
Date de intrare
Se citește de la tastatura valoarea .
Date de ieșire
0<= x <1 afișat cu o aproximare de 8 zecimale precise.
Restricții și precizări
- pentru orice 0<=y<2.7 vom avea ca 0<=x<1
Exemplul 1
Intrare:
1.34
Ieșire:
0.35083179
Explicație
Considerand f(x)=sin(x)+sin(2∗x)+x avem ca:
• f(0.35083177) = 1.33999994
• f(0.35083178) = 1.33999998
• f(0.35083179) = 1.34000001
• f(0.35083180) = 1.34000005
După cum se observă, valoarea cea mai apropiată de în aproximarea cu 8 zecimale este , valoare ce este considerată a fi corectă (deși imprecisă, este cea mai apropiată valoare ce ar putea fi dată lui x pentru ca ).
Exemplul 2
Intrare
3
Ieșire
Valoarea lui y nu respectă restricțiile.
<syntaxhighlight lang="python3" line="1"> import math
def f(x):
return math.sin(x) + math.sin(2*x) + x
def verifica_restrictie(y):
return 0 <= y <= 2.7
def aproximare_bisectie(y):
epsilon = 1e-8 # Precizia dorită a, b = 0, 1 # Intervalul [0, 1)
while b - a > epsilon: mid = (a + b) / 2 if f(mid) < y: a = mid else: b = mid
return (a + b) / 2
def main():
y = float(input("Introduceți valoarea y: ")) if verifica_restrictie(y): rezultat = aproximare_bisectie(y) print(f"{rezultat:.8f}") else: print("Valoarea lui y nu respectă restricțiile.")
if __name__ == "__main__":
main()
</syntaxhighlight>