8

mathematica や mathlab などのプログラムが関数のグラフをこれほど優雅かつ高速にプロットする方法を知りたいと思っていました。彼らがこれをどのように行うのか、さらに私がこれをどのように行うことができるのか、誰かが私に説明できますか? コンピュータ プログラミングや数学の側面やコースに関連していますか? じゃあどっち?

4

4 に答える 4

5

まあ、ベリサリウスからの励ましで、答えとして私のコメントがあります:matplotlibを見てみてください。ホームページから:

matplotlib は python 2D プロット ライブラリで、さまざまなハードコピー形式とプラットフォーム間でのインタラクティブな環境で出版品質の図を生成します。matplotlib は、python スクリプト、python および ipython シェル (ala MATLAB®* または Mathematica®†)、Web アプリケーション サーバー、および 6 つのグラフィカル ユーザー インターフェイス ツールキットで使用できます。

当初は MATLAB のプロット機能に触発されましたが、それ以来大幅に拡張されています。これは堅実なソフトウェアであり、オープン ソースであり、BSD ライセンスに基づいているため、ソースを読むだけでなく、ハッキングして好きなように使用できます。

あなたが見ることができる別の場所はgnuplotです。これは一般的なオープン ソース ライセンスの 1 つではありませんが、確かにオープン ソースであり、変更などの許可がいくつかあります。

Gnuplot は、Linux、OS/2、MS Windows、OSX、VMS、およびその他の多くのプラットフォーム用の移植可能なコマンドライン駆動のグラフ作成ユーティリティです。ソース コードは著作権で保護されていますが、自由に配布できます (つまり、料金を支払う必要はありません)。もともとは、科学者や学生が数学関数やデータをインタラクティブに視覚化できるようにするために作成されましたが、Web スクリプトなどの多くの非インタラクティブな使用をサポートするようになりました。また、Octave などのサードパーティ アプリケーションによるプロット エンジンとしても使用されます。Gnuplot は 1986 年からサポートされ、活発に開発されています。

3D プロットも行いますが、これは matplotlib にはありません。最初に matplotlib を考えた理由は、それがスタンドアロン アプリケーションではなく、高水準言語用のライブラリとして意図されているためです。

Mathematica が内部で行っていることの種類を把握するためのもう 1 つの提案は、Plot のドキュメントを参照することです。特に、利用可能なオプションを見れば、物事を推測することができます。

MaxRecursion Automaticサンプルポイントの初期数を最適化Method Automaticするために、メソッドがパフォーマンスの曲線 PerformanceGoal $PerformanceGoal の側面を 調整するために使用できる再帰的細分化の最大数 PlotPoints Automatic

MaxRecursionとから、PlotPoints最初のサンプリングを行ってから、プロットの正確なビューを取得するためにどの領域を再分割 (再サンプリング) する必要があるかを何らかの方法で決定していることがわかります。そこから先は魔法です。これにはいくつかの方法があり、MethodそれPerformanceGoalを導く方法があります...

于 2011-01-23T15:47:34.917 に答える
1

MATLAB の場合、クロスプラットフォームの要件があるため、OpenGLを使用する以外に選択肢はありません。MATLAB ランタイムは C++ で記述され、非軸 GUI は Java Swing を使用します。したがって、MATLAB Plot はおそらく C++/OpenGL/Swing の混合物です。

実際には、MATLAB グラフィックスは、ビデオ ゲームのグラフィックスほど複雑ではありません。ビデオ ゲームのグラフィックスに関するチュートリアルを見つけて、同じ色で 1 本の線を描くように、MATLAB の機能に "縮小" する方が簡単だと思います。

最も重要な概念は、おそらくTransformation Matrixです。

于 2011-01-23T08:10:31.143 に答える
1

基本的に、あらゆる種類のグラフ (特に、適度に複雑なグラフ) をプロットするほとんどのプログラムは、何らかの種類のサードパーティ ライブラリを使用します。

使用される特定のライブラリは、使用されているプログラミング言語によって異なります。例えば:

.Net アプリケーションの場合、Crystal レポートを使用できます。http://en.wikipedia.org/wiki/Crystal_Reports

Java の場合、JFreeChart を使用できます。http://www.jfree.org/jfreechart/ など...

コーディングする言語に関係なく、多数のライブラリが見つかる可能性があります。

特定のプロジェクトでこの機能を実現したい場合、特に初心者の場合はライブラリを使用することをお勧めします。これらのグラフ ライブラリがどのように実装されるかの内部の複雑さは、クロス プラットフォームの互換性、グラフィック レンダリングの最適化 (つまり、グラフィックがすばやく「きれいに」レンダリングされることを確認する)、要素の配置に関連する数学などの多くの問題のために重要です。グラフなど。

最後に、非常に特殊なケースを除いて、プログラマーは常に既存のライブラリを使用するため、このテーマで特定のコースを見つける (または必要とする) とは思えません。

誰かがすでに問題を解決しているのに、なぜ自分でコーディングするのでしょうか?

于 2011-01-23T08:28:59.050 に答える
0

まず始めに、グラフィックスには文法があり、プロット コマンドを受け取ったときに作成したいものはグラフの記号表現であることを理解することをお勧めします。Mathematica の場合、次のようなことができます

FullForm[Plot[Sin[x], {x, 0, 2 Pi}]]

Mathematica が使用する内部表現を見ることができます.基本的に、描画する線分 (2D) またはメッシュ (3D) を色と座標で記述する必要があります。また、グラフのスケール、目盛りの描画方法、軸のラベル付けなどに関する情報も必要です。

これは、関数と範囲から描画する線分をどのように決定するのかという問題の核心につながります。plot のヘルプ ファイルを調べてみると、いくつかのことがわかります。まず、プロット ポイント オプションと MaxRecursion オプションがあります。これにより、 Mathematica は開始値を取得するために、範囲全体で点の初期数を等間隔でプロットすると信じるようになります(これは経験に基づいた推測にすぎませんが、私が実際に行う方法です)。次の部分は、変化がしきい値を超える領域を特定し、線分内の任意の 2 点間の「変化」がしきい値を下回るまで、より多くの点をサンプリングすることです。Mathematica はこれを再帰的に行うため、MaxRecursion オプションを使用します。

これまで、私は変化率の定義についてかなりあいまいでした。変化を説明するより便利な方法は、線分で 3 ポイントを取ることです。1 番目と 3 番目の点の間に線形関係があると仮定し、この線形関係を仮定して、2 番目の点がどうなるかを予測します。この予測の誤差が十分に小さい場合は、次の 3 つのポイントのグループを検討してください。エラーがしきい値を超えている場合は、しきい値に達するまで、この領域でさらにいくつかのポイントをサンプリングする必要があります。このようにして、曲線が比較的直線である比較的少数のポイントを必要とし、新しい方向に曲がる「興味深い」部分でより多くのポイントを必要とします。描画する曲線の滑らかさは、点の線形予測で許容できる誤差に比例します。

于 2011-01-26T03:55:52.050 に答える