おおよその∫((e ^ x)/(x ^ x))dx


24

次の値を概算します。

ここに画像の説明を入力してください

入力はどこにありますかI

ルール

  • 組み込みの積分関数は使用できません。
  • 組み込みの無限合計関数を使用することはできません。
  • コードは妥当な時間内に実行する必要があります(私のマシンでは20秒未満)
  • 入力は0より大きく、言語の上限よりも小さいと仮定できます。
  • 任意の形式の標準の戻り値/出力が可能です。

結果はWolfram |で確認できます アルファ(目的の入力をリンクされたクエリに連結することで確認できます)。

(関数を呼び出しましょうf

f(1) -> 2.18273
f(50) -> 6.39981
f(10000) -> 6.39981
f(2.71828) -> 5.58040
f(3.14159) -> 5.92228

あなたの答えはに正確でなければなりません±.0001


@ThomasKwa使用言語の最大値。質問に追加します。
アディソンクランプ

ウルフラムアルファは、への最後の1ラウンドを言う5.92228
ニール

@Neil ooそれでは、入力ミスがあったに違いありません。ありがとう!
アディソンクランプ

7
WabbitEmuで100%の速度で20秒以内に実行されるTI-BASICの最短有効回答に対して200担当者を授与します。
リトシアスト

@lirtosiastこの賞金のフォローアップを引き続き行う場合は、代わりにここに投稿してください
アディソンクランプ

回答:


10

ジュリア、79 77 38バイト

I->sum(x->(e/x)^x,0:1e-5:min(I,9))/1e5

これは、数値を受け入れ、floatを返す匿名関数です。呼び出すには、変数に割り当てます。

ここでのアプローチは、右リーマン和を使用して積分を近似することです。これは次の式で与えられます。

ラテックス

この場合、a = 0およびb = I、入力です。我々はへの統合の領域を分割し、N = 10の5別個の部分ので、Δ X = 1 / N = 10 -5。これは合計に対する定数であるため、これを合計の外側に引き出し、各ポイントで関数評価を合計してnで除算することができます。

この関数は驚くほどうまく動作しています(Mathematicaからのプロット):

数学的な

関数は約9を超える入力に対してほぼ0に評価されるため、9 未満の場合は入力をIにそうでない場合は9に切り捨てます。これにより、実行する必要がある計算が大幅に簡素化されます。

未ゴルフコード:

function g(I)
    # Define the range over which to sum. We truncate the input
    # at 9 and subdivide the region into 1e5 pieces.
    range = 0:1e-5:min(I,9)

    # Evaluate the function at each of the 1e5 points, sum the
    # results, and divide by the number of points.
    return sum(x -> (e / x)^x, range) / 1e5
end

デニスのおかげで39バイト節約されました!


これも$ \ frac {t \ sum_ {k = 0} ^ {n}(f(a + kt)+ f(a +(k + 1)t))} {2} $と同等ではありませんか?これは、使用するアルゴリズムがやや単純に思えます。
アディソンクランプ

10^4と書くことができます1e4
レイナーP.

@VoteToClose別のアプローチを取ることになった
アレックスA.

@RainerP。へえ、そう。ありがとう。
アレックスA.

積分の漸近値は$ 6.39981 ... $です。値$ 6.39981 ...-10 ^ {-4} $は最初に$ I = 7.91399 ... $で達成されるため、$ 9 $の代わりに$ 8 $で切り捨てて時間を節約できます。
エリックタワーズ

9

ゼリー、20 19 17バイト

ð«9×R÷øȷ5µØe÷*×ḢS

これは、@ AlexA。の答えから9トリック巧妙な切り捨てを借用し、右リーマン和を使用して対応する積分を推定します。

切り捨てられたテストケースには時間がかかりますが、オンライン試してみてください!

使い方

ð«9×R÷øȷ5µØe÷*×ḢS  Main link. Input: I

      øȷ5          Niladic chain. Yields 1e5 = 100,000.

ð                  Dyadic chain. Left argument: I. Right argument: 1e5.
 «9                Compute min(I, 9).
   ×               Multiply the minimum with 1e5.
    R              Range; yield [1, 2, ..., min(I, 9) * 1e5] or [0] if I < 1e-5.
     ÷             Divide the range's items by 1e5.
                   This yields r := [1e-5, 2e-5, ... min(I, 9)] or [0] if I < 1e-5.

         µ         Monadic chain. Argument: r
          Øe÷      Divide e by each element of r.
             *     Elevate the resulting quotients to the corresponding elements,
                   mapping t -> (e/t) ** t over r.
                   For the special case of r = [0], this yields [1], since
                   (e/0) ** 0 = inf ** 0 = 1 in Jelly.
              ×Ḣ   Multiply each power by the first element of r, i.e., 1e-5 or 0.
                S  Add the resulting products.

ああ大丈夫。左手のルールは、AP Calculusクラスでの参照方法です。:P Coolio。
アディソンクランプ

私はその名前に精通していませんが、左手のルールはおそらく左のエンドポイントを使用しています。私のコードは正しいものを使用しています。
デニス

2
(〜-.-)〜それは何らかの形の手渡されたルールです。xD
アディソンクランプ

4

ES7、78バイト

i=>[...Array(n=2e3)].reduce(r=>r+Math.exp(j+=i)/j**j,0,i>9?i=9:0,i/=n,j=-i/2)*i

これは、2000個の長方形を使用した長方形ルールを使用します(少なくとも例では)十分に正確な答えが得られるようですが、必要に応じて精度を簡単に上げることができます。9のトリックを使用する必要があります。そうしないと、値が大きい場合に精度が低下します。

Math.expがInfinityにヒットするため、幅が〜0.001の長方形を使用する73バイトバージョンで、〜700を超えると動作しません。

i=>[...Array(n=i*1e3|0)].reduce(r=>r+Math.exp(j+=i)/j**j,0,i/=n,j=-i/2)*i

2

golflua、83文字

私はそれを認める:min(I,9)アレックスが示したトリックを理解するのに少し時間がかかった。それは積分がそれまでに収束したので、任意の高い数値を計算することを可能にした。

\f(x)~M.e(x)/x^x$b=M.mn(I.r(),9)n=1e6t=b/n g=0.5+f(b/2)~@k=1,n-1g=g+f(k*t)$I.w(t*g)

ルアに相当するものは、

function f(x)
   return math.exp(x)/x^x
end

b=math.min(io.read("*n"),9)
n=1e6
t=b/n
g=0.5+f(b/2)

for k=1,n-1 do
   g=g+f(k*t)
end
io.write(t*g)

「しばらく」とは、約10分という意味です。そして、それは完全に、私が実際にそれを説明するアレックスのコメントを読んでおらず、コードで見ただけだったからです。
カイルカノス

2

Python 2、94 76バイト

18バイト節約してくれた@Dennisに感謝します!

lambda I,x=1e5:sum((2.71828/i*x)**(i/x)/x for i in range(1,int(min(I,9)*x)))

テストケースでオンラインでお試しください!

近似に長方形法を使用します。0.0001の長方形幅を使用すると、要求される精度が得られます。また、非常に大きな入力でのメモリエラーを防ぐために、9より大きい入力を切り捨てます。


2

Perl 6の、90の 55バイト

{my \x=1e5;sum ((e/$_*x)**($_/x)/x for 1..min($_,9)*x)}

使用法

my &f = {my \x=1e5;sum ((e/$_*x)**($_/x)/x for 1..min($_,9)*x)}

f(1).say;       # 2.1827350239231
f(50).say;      # 6.39979602775846
f(10000).say;   # 6.39979602775846
f(2.71828).say; # 5.58039854392816
f(3.14159).say; # 5.92227602782184

遅いので寝る必要があります。明日これをもっと短くできるかどうか確認します。

編集:@DenkerAffeのメソッドを見た後、かなり短くすることができました。


1
そこに$ h * tと表示されるのが好きです。:D
アディソンクランプ

2

Pyth、34 29バイト

@Dennisの助けを借りて5バイトを節約しました!

J^T5smcc^.n1d^ddJmcdJU*hS,Q9J

オンラインでお試しください!

説明

私のPythonの答えと同じアルゴリズム。

J ^ T5smcc ^ .n1d ^ ddJmcdJU * hS、Q9J#Q = input
J ^ T5#長方形の幅* 10 ^ 5になるようにJを設定
                       hS、Q9#9より大きい入力を切り捨てる
                 mcdJU / J#ゼロからJステップの入力までの範囲
     mcc ^ .n1d ^ ddJ#リスト内の各要素の面積を計算
    s#すべての面積と出力結果の合計


乗算に割り当てJ^T5、乗算を除算と交換することで、数バイトを節約できますJ。また、切り捨てはで行うことができますhS,Q9
デニス

@デニスありがとう、それについて考えていませんでした。また、ソートトリックがいいです、私は探していたmin^^
Denker

2

MATL、26バイト

9hX<t1e6XK:K/*ttZebb^/sK/*

これは、積分をリーマン和として近似します。Alexが主張したように、関数値はそれを超えて非常に小さいため、積分間隔を約9で切り捨てることができます。

関数の最大値は3未満であるため、希望の精度を得るには約1e-5のステップで十分です。したがって、最大入力9には約1e6ポイントが必要です。

これは、入力値に対して、オンラインコンパイラで約1.5秒かかります。

オンラインでお試しください

9hX<         % input number, and limit to 9
t            % duplicate
1e6XK:       % generate vector [1,2,...,1e6]. Copy 1e6 to clipboard K
K/*          % divide by 1e6 and multiply by truncated input. This gives 
             % a vector with 1e6 values of x from 0 to truncated input
ttZe         % duplicate twice. Compute exp(x)
bb^          % rotate top three elements of stack twice. Compute x^x
/            % divide to compute exp(x)/x^x
s            % sum function values
K/*          % multiply by the step, which is the truncated input divided
             % by 1e6

2

Vitsy、39バイト

私も自分の貢献をするかもしれないと思った。¯\ _(ツ)_ /¯これは、積分の左手リーマン和推定を使用します。

D9/([X9]1a5^D{/V}*0v1{\[EvV+DDv{/}^+]V*

D9/([X9]               Truncation trick from Alex A.'s answer.
D                      Duplicate input.
 9/                    Divide it by 9.
   ([  ]               If the result is greater than 0
     X9                Remove the top item of the stack, and push 9.

1a5^D{/V}*0v0{         Setting up for the summation.
1                      Push 1.
 a5^                   Push 100000.
    D                  Duplicate the top item of the stack.
     {                 Push the top item of the stack to the back.
      /                Divide the top two items of the stack. (1/100000)
       V               Save it as a global variable.
                       Our global variable is ∆x.
        }              Push the bottom item of the stack to the top.
         *             Multiply the top two items.
                       input*100000 is now on the stack.
          0v           Save 0 as a temporary variable.
            0          Push 1.
             {         Push the bottom item of the stack to the top.
                       input*100000 is now the top of the stack.

\[EvV+DDv{/}^+]        Summation.
\[            ]        Loop over this top item of the stack times.
                       input*100000 times, to be exact.
  E                    Push Math.E to the stack.
   v                   Push the temporary variable to the stack.
                       This is the current value of x.
    V+                 Add ∆x.
      DD               Duplicate twice.
        v              Save the temporary variable again.
         {             Push the top item of the stack to the back.
          /            Divide the top two items.
                       e/x
           }           Push the top item back to the top of the stack.
            ^          Put the second to top item of the stack to the power of the top item.
                       (e/x)^x
             +         Add that to the current sum.

V*                     Multiply by ∆x

これにより、合計がスタックの最上部に残ります。N結果を表示するために、以下のオンライン試用リンクが最後にあります。

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.