Modo rapido per verificare se$f(x)>x$per quale valore di$x$
Per trovare il valore$x$per cui$f(x)>x$, l'ho provato usando il seguente codice:
ParallelTable[If[TrueQ[f[x]>x],x,Nothing],{x,0,10^9}]
Per qualche funzione$f(x)$. Ma ci vuole un'eternità, c'è un modo per farlo andare più veloce?
Risposte
Funziona o no?
Reduce[Cos[x] > x && -6 < x < 6, x, Reals] // N
Reduce[N[{Cos[x] > x && -6 < x < 6}], x, Reals]
complotto
Clear["`*"];
fig = Plot[{Cos[x], 0}, {x, -6, 6},
MeshFunctions -> {Function[x, Cos[x] - x]}, Mesh -> {{0}},
MeshShading -> {Directive[Opacity[0.1], Blue], Red},
AspectRatio -> Automatic, Axes -> False]
Come suggerisce @flinty in un commento, può dipendere dalla funzione. Per Cot[x](dal commento di OP) , che è vettorizzato (e parallelizzato automaticamente) in MKL, ecco un modo:
Block[{chunk = 10^9/20000},
Table[
Round@Pick[#, UnitStep[# - Cot@#], 0] &@
Range[chunk*k + 1., chunk*(k + 1)],
{k, 0, 10^9/chunk - 1}
] // Flatten
] // AbsoluteTiming
(* {9.04107, {22, 44, 355, 710, 1065, 1420, 1775, 2130, 2485, 2840, 3195, 312689, 1146408, 5419351, 10838702}} *)
Nota 1: una chiave per la funzione Cot[x]è evitare Cot[0], che è ComplexInfinity. Evitando i non Realrisultati si consente al calcolo di utilizzare array compressi efficienti.
Nota 2: la modalità di suddivisione in blocchi dei calcoli dipende dal sistema. Il pieno 10^9fa battere la mia memoria. Con chunk = 10^9/10, la tempistica scende a 18-19 sec. Poi diminuisce fino a circa 10^9/20000.