問題タブ [numerical-analysis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
batch-file - 変数宣言で出力を取得せずにバッチ ファイルを実行する [オクターブ]
オクターブでスクリプトファイルを使用しています。問題は、大きな行列を宣言すると、コマンド プロンプトに出力されるため、非常に煩雑になることです。
それを防ぐ簡単な方法はありますか?
python - Python での scipy.optimize.curve_fit による数値精度
Python の scipy.optimize.curve_fit 関数の数値精度に問題があります。〜15桁を希望する場合、〜8桁の精度しか得られないように思えます。次のデータ作成から作成されたデータ(この時点では人工的に作成された)があります。
ここで、項 1 ~ 10^-3、項 2 ~ 10^-6、および項 3 は ~ 10^-11 です。データでは、私はA
ランダムに変化します (ガウス誤差です)。次に、これをモデルに適合させようとします。
ここで、ラムダは定数であり、私は適合alpha
するだけです (関数内のパラメーターです)。alpha
データ作成の項 1 と 2 もモデルに含まれているため、との間に線形関係が見られると予想されるA
ので、それらは完全に相殺されるはずです。
そう;
ただし、小さい場合A
(~10^-11 以下) は、 にalpha
合わせてスケーリングされませんA
。つまり、A
小さくなるにつれて、alpha
水平になり、一定のままになります。
参考までに、次のように呼び出します: op, pcov = scipy.optimize.curve_fit(model, xdata, ydata, p0=None, sigma=sig)
私の最初の考えは、私は倍精度を使用していなかったということでしたが、Python が自動的に倍精度で数値を作成することは確かです。それから、おそらく数字が途切れているのはドキュメントの問題だと思いましたか?とにかく、ここにコードを入れることはできますが、ちょっと複雑です。カーブ フィッティング関数で数字が確実に保存されるようにする方法はありますか?
手伝ってくれてどうもありがとう!
編集:以下は私のコードです:
performance - Haskell のパフォーマンス: プロファイリング結果の利用と基本的なチューニング手法 (明示的な再帰の排除など) に苦労しています。
私は Haskell で遊ぶことから少し長い休憩を取っていましたが、それに戻り始めています。私は間違いなくまだ言語を学んでいます。Haskell を書いているときに常に緊張したり不快に感じたりする原因の 1 つは、慣用的でパフォーマンスの高いアルゴリズムを作成する方法をしっかりと把握していないことです。「時期尚早の最適化はすべての悪の根源である」ことは理解していますが、同様に遅いコードは最終的に処理する必要があり、非常に高レベルな言語は非常に遅いという先入観を取り除くことはできません。
そういうわけで、私はテストケースをいじり始めました。dy/dt = -y; y(0) = 1
私が取り組んでいたものの 1 つは、かなり自明な IVPに適用された、古典的な 4 次ルンゲクッタ法のナイーブで単純な実装でしたy = e^-t
。Haskell と C の両方で完全に単純な実装を作成しました (これについては、すぐに投稿します)。Haskell バージョンは信じられないほど簡潔で、見たときに内部がぼやけていましたが、C バージョン (実際には解析するのはまったくひどいものではありませんでした)は 2 倍以上高速でした。
2 つの異なる言語のパフォーマンスを比較するのは 100% 公平ではないことは承知しています。そして、私たち全員が死ぬ日まで、C は、特に手動で最適化された C コードのパフォーマンスの王としての王冠を保持する可能性が最も高いでしょう。Haskell の実装を C の実装と同じくらい速く実行しようとしているわけではありません。しかし、自分が何をしているのかをもっと認識していれば、この特定の Haskell 実装からもう少しスピードを求めることができると確信しています。
Haskell バージョンは-02
OS X 10.8.4 上の GHC 7.6.3 でコンパイルされ、C バージョンは Clang でコンパイルされ、フラグは付けませんでした。で追跡した場合、Haskell バージョンは平均で約 0.016 秒time
、C バージョンは約 0.006 秒でした。
これらのタイミングは、stdout への出力を含むバイナリの実行時間全体を考慮に入れており、明らかにオーバーヘッドの一部を占めていますが、-prof -auto-all
GC で再コンパイルして実行し+RTS -p
、GC を調べることによって、GHC バイナリのプロファイリングを行いました。との統計+RTS -s
。私が見たもののすべてを本当に理解していたわけではありませんでしたが、GC が制御不能ではないように見えましたが、おそらく少しは抑制できたようです (5%、~93% のユーザーでの生産性、~85総経過時間の割合) であり、生産的な時間のほとんどが function に費やされました。関数iterateRK
を書いたときに遅いことはわかっていましたが、それをクリーンアップする方法がすぐにはわかりませんでした。リストの使用でおそらくペナルティが発生していることに気づきました。cons
ing と、結果を stdout にダンプする際の怠惰。
私は正確に何を間違っていますか?クリーンアップに使用できることを悲劇的に認識していないライブラリ関数またはモナドの魔法は何iterateRK
ですか? GHCプロファイリングのロックスターになる方法を学ぶための良いリソースは何ですか?
RK.hs
RK.c
numerical-analysis - 非線形多項式を効率的かつ正確に数値計算する方法は?
(この問題をこのサイトに投稿すべきか、数学のサイトに投稿すべきかわかりません。必要に応じて、この投稿を自由に移行してください。)
当面の問題は、次のようなk
非線形多項式の有理関数を数値的に計算したいという値が与えられたこと
です。 、 は実定数で、は虚数です。Numerical Recipesから、すべての係数が一定であれば、丸め誤差を十分に小さく保ちながら、多項式をすばやく計算する方法がたくさんあることを学びました。しかし、指数関数の前置因子も に依存しているため、これらのアイデアは私の場合には役に立たないと思います。k
{a_0, ..., a_N; b_0, ..., b_N}
{u_0, ..., u_N, v_0, ..., v_N}
i
k
現在、私はCで力ずくで計算していますcomplex.h
(これは単なる擬似コードです):
ただし、呼び出しの数がfunction
増えると (これは実際の計算の一部にすぎないため)、非常に遅く、不正確です (有効な数字は 6 桁のみ)。コメントや提案をお待ちしております。
c++ - C++ の入力としての関数
C++でニュートン法用の関数を作成しています。
アルゴリズムで使用する関数を指定できるようにしたいのですが、入力として欲しいです。
例えば:
ここで、fとdfはそれぞれ関数とその導関数です。
しかし、どうすればこれを行うことができますか?
matlab - Matlab と Octave で inv() と pinv() の出力が等しくないのはなぜですか?
A が NxN 行列で、逆行列があることに気付きました。しかし、inv() と pinv() 関数の出力は異なります。- 私の環境は Win7x64 SP1、Matlab R2012a、Cygwin Octave 3.6.4、FreeMat 4.2 です。
Octave の例を見てみましょう。
ans
上記と同じコマンドを Matlab で実行しても、すべて同じ結果になります。
inv(A)*A
orを計算するA*inv(A)
と、結果は Octave と Matlab の両方で単位 3x3 行列になります。- との結果は
A*pinv(A)
、pinv(A)*A
Matlab と FreeMat の恒等 3x3 行列です。 - の結果は
A*pinv(A)
、Octave の恒等 3x3 行列です。 - の結果は、Octave の恒等 3x3 行列で
pinv(A)*A
はありません。
理由はわかりませんがinv(A) != pinv(A)
、マトリックス内の要素の詳細を検討しました。この問題を引き起こすのは、浮動精度の問題のようです。
ドット ポイントの後の 10 桁以上は、次のように異なる場合があります。
6.65858991579923298331777914427220821380615200000000
inv(A)(1,1)
反対の要素6.65858991579923209513935944414697587490081800000000
の要素pinv(A)(1,1)
c++ - 合計が指定された数で除算される配列の部分配列の数を見つける
アルゴリズムに関する 1 つの質問に行き詰まりました。以下の問題に対する効率的なアルゴリズムを提案してください。
質問は
合計が指定された数で割り切れる部分配列の数を見つけます。
私の仕事
複雑さが O(N^2) の 1 つのアルゴリズムを作成しました。ここでは、N = 配列のサイズです。
マイコード