かどうかを確認するための迅速な方法 $f(x)>x$ どのような値のために $x$

Aug 25 2020

値を見つけるために $x$ そのために $f(x)>x$、次のコードを使用して試しました。

ParallelTable[If[TrueQ[f[x]>x],x,Nothing],{x,0,10^9}]

一部の機能について $f(x)$。しかし、それは永遠にかかります、それをより速くする方法はありますか?

回答

2 cvgmt Aug 25 2020 at 06:40

それはうまくいくかどうか?

Reduce[Cos[x] > x && -6 < x < 6, x, Reals] // N
Reduce[N[{Cos[x] > x && -6 < x < 6}], x, Reals]

プロット

  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

@flintyがコメントで示唆しているように、それは関数に依存する可能性があります。Cot[x](OPのcommmentから) MKLに(&自動並列化)ベクトル化され、ここでの方法は、次のとおりです。

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}}
*)

注1:関数のは、Cot[x]を避けるCot[0]ことですComplexInfinity。これはです。Real結果以外を回避することで、計算で効率的なパック配列を使用できます。

注2:計算をチャンク化する方法はシステムによって異なります。いっぱいに10^9なると私の記憶がどきどきします。を使用するchunk = 10^9/10と、タイミングは18〜19秒になります。その後、約まで減少し10^9/20000ます。