(適応?)関数プロットのアルゴリズム


21

私は、特異性を持っているかもしれないし、持っていないかもしれない関数のために標準的な2Dグラフを描くアルゴリズムを探しています。目的は「Mini-CAS」を作成することです。そのため、ユーザーがグラフ化する機能のタイプについての先験的な知識はありません。

この問題は非常に古いので、文献には標準的なアルゴリズムがいくつかあるはずです。かつては、Googleを介して参照を見つけることにあまり成功していませんでした。

1つの興味深いアルゴリズム、つまり「Adaptive function plotting」という名前の「YACAS-アルゴリズムの本」からのアルゴリズムを見つけました 。

要するに:

  • 標準のアルゴリズムはありますか?
  • 既知のプロット困難な関数のテストスイートはありますか?
  • 読むべき興味深い論文は何ですか?

2
質問は「グラフ描画」ではなく「関数プロット」でよりよく理解されるでしょうか?最初はタイトルを誤って解釈しました(グラフ理論)。
アストロフアンル

@ Juanlu001提案をありがとう。タイトルを変更しました。
-soegaard

あなたは、2Dを言うとき、あなたのような1変数関数をプロット意味ですか、またはあなたはまた、2変数関数(に興味がある、F X Y を表す例えば異なる色/色合いと2Dに示されています)異なる値?f(x)f(x,y)
ザボルクス

まあ、私は1つの変数の関数をプロットすることを意味しました。ただし、2変数設定でも評価するポイントを選択するアルゴリズムについても聞きたいと思います。私は色や陰影について聞くことに興味がありません。
-soegaard

2D関数については、私の質問と回答をご覧ください。そこで行ったことは非常に限られており、任意の機能ではうまく機能しません。また、説明から欠落しているいくつかの重要な手順があります。これがないと、メソッドは適切に収束しません。次の再三角測量で消えるメッシュの各エッジの中央に新しいサンプリングポイントを挿入する必要がありました。(続き)
Szabolcs

回答:


10

ここで Mathematicaの適応サンプリングルーチンをGitHubに実装しました(単一のCファイルで、ヘッダーファイルのソースツリーに移動します)。Mathematicaの大きな本でルーチンの説明を見つけたのはかなり前で、この実装のバリエーションをしばらく使ってきました。基本的には、対象のドメインで大まかな線形サンプルを実行し、その後、曲率の高い領域を絞り込むために戻ります。いくつかの非常にシャープな機能が欠落している可能性がありますが、実際にはこれは非常にまれです。このファイルには、パラレルバージョンも含まれています。


1
それはどの本ですか?それは私がリンクしたものですか?バージョン5と6の間で実装の変更点を正確に知っていますか?
サボルクス

1
@Szabolcs:いいえ、この本のセクション4.1.3にあったと思います。説明は非常に古いバージョンのMathematicaに適用されます。新しいバージョン(おそらくv6以降)は、垂直漸近線を検出し、プロットから誤った垂直線を削除します。新しいバージョンでは、不連続性、未定義の領域、ブランチカットに対処するために、多くの洗練されたシンボリック前処理を確実に実行します。
ビクター

あなたが話している象徴的な前処理は、ドキュメントでは「除外検出」と呼ばれています。として定義することExclusions -> Noneで、関数の構造を非表示にするか、または非表示にすることでオフにできます。これは、変更について尋ねたときに言及したものではありません。v5とv6が異なるポイントでサンプリングされたため、アルゴリズムにいくつかの変更があったと思います。現時点では、v5で再度テストすることはできません。Plotf[x_?NumericQ] := ...
ザボルクス

「Mathematicaグラフィックスガイドブック」には問題に関する非常に良い議論が含まれていました。私は、アルゴリズムの短所も説明されていることを特に気に入っています。
-soegaard

GitHubファイルが見つからなくなった場合、移動しましたか?
アンドレイ14年

12

他のCASがこれをどのように行うかを知ることはあなたを助けるかもしれません。

f(x)(x(t),y(t))f(x)

  1. プロット領域上の点の規則的な間隔のグリッドから始めます。(Mathematicaには、取得する数を制御するパラメータがありますPlotPoints。)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. まだ反復制限に達していない場合(MaxRecursionMathematicaで設定)、ステップ2から繰り返します。

これのいくつかは、Stan WagonによるMathematica in Actionの本で議論されています。これは、Google Booksで見ることができます

私はこのアルゴリズムを実装してから、高価な計算関数が評価される回数をより適切に制御できるようにしました。これがステップ2のMathematicaコードです。

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

関数グラフのMathWorld Webページは、適応機能のプロットに関連すると思われるいくつかの論文への参照が含まれています。ページの引用:

グラフをプロットするための適切なルーチンは、関数が最も急速に変化する領域でより多くのポイントをプロットする適応アルゴリズムを使用します(Wagon 1991、Math Works 1992、Heck 1993、Wickham-Jones 1994)。タッパー(1996)はアルゴリズムを開発しました[...]

一方、Googleでつまずいたのは論文です

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

これは、ドメインなどを適切に選択する方法を説明しています。それらがあなたに役立つことを願っています。


1

このトピックを見つけたので、これをJuliaライブラリPlots.jlに追加するために開発者の問題ページを共有する必要があると考えました。Mathematicaの実装に関する注意事項から始めて、何が良い結果をもたらすかを見るために多くのテクニックを試しました。いくつかの枝刈り、間隔の端点で正確に開始しないための小さな摂動、再帰制限、およびデュアルメッシュエラー推定器を追加することは、「適切に行う」ためにすべて必要でした。スレッドは、実装のオープンソースコードも示します。そのため、少し調整が必要でしたが、これらの機能を追加するとかなり堅牢になりました(スレッドに示すように、テストによると)。

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