Modo rapido per verificare se$f(x)>x$per quale valore di$x$

Aug 25 2020

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

2 cvgmt Aug 25 2020 at 06:40

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]
1 MichaelE2 Aug 25 2020 at 09:18

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.