シンプソン 公式。 Python

シンプソンの公式と誤差評価

シンプソン 公式

CONTENTS• スポンサーリンク 数値計算による積分計算の基本~Simpson法~ 積分の計算は高校生までは紙とペンを使用し、様々な積分テクニック(置換積分・部分積分など)を駆使して行っていきます。 大学の初年度に上がると重積分を学習しますが、これも紙とペンを使って問題を解いていき、単位を取得します。 ところが、大学3年生以上になり、専門分野の勉強が進んでいくと、紙とペンでは解けない積分や、紙とペンを解くのが非常に難解だったり、手続きが多くてミスが起こりやすい積分の問題に度々出会うようになります。 そこで、「積分の計算をコンピュータで解く方法」が開発されており、代表例として シンプソン法があります。 今回の資料は、シンプソン法の理論的解説を詳しく行い、 プログラムを解いたり、シンプソン法を使ったプログラムを使用する際に迷いが起こらないようにするための基礎知識を整理するための資料になります。 台形近似より精度の高いシンプソン法 うん! まとめ 今回は、積分をコンピュータで解くのに使用されるシンプソン法について解説しました。 積分をコンピュータで解く初歩的な方法には 台形近似があるのですが、台形近似では非線形性の高い関数の積分を行ったときに精度の甘さが出てきてしまいます。 ここで、 「積分計算を台形の集合体の和ではなく、二次関数の集合体の和に近似しよう。 」というのがシンプソン法の発想です。 ストークも惑わされた 言葉の定義についてですが、積分したい関数を二次関数に近似するだけの公式を単に 「シンプソンの公式」といい、 積分したい関数を二次関数の集合体として取り扱う公式を 「合成シンプソンの公式」と呼びます。 私たちが積分の計算でプログラムを組む時に使われるのは「合成シンプソンの公式」の方になります。 合成シンプソンの公式でググってみるとわかると思いますが、色々な式の形があり、混乱することがあると思います。 奇数だけ足し合わせたり、偶数だけ足し合わせるとか、色々です。 しかし、 基本思想として「2次関数近似の寄せ集め」ということを理解しておけば、自分なりの理解の仕方がマスターでき、それに基づいてプログラムを書けるようになるでしょう。 この資料は私のシンプソン法への自分なりの理解の整理の結果でもあるのです。

次の

数値計算を使って積分の計算を行う~シンプソン法の解説~

シンプソン 公式

関数 の定積分を微小区間に分割して近似値として求める方法を数値積分と言います。 そして、以前「台形則による定積分」についてお話ししました。 まず、台形則では極小区間を直線で近似していたのに対し、シンプソン則では二次曲線で近似します。 前提条件• Scientific Linux 6. 3 64bit での作業を想定。 6 20120305 Red Hat 4. 6-4 1. 000000 積分記号(インテグラル)をイメージして出力しています。 被積分関数を define で定義しているため、関数値 が大きめに丸められており、誤差が若干大きいです。 また、区間分割数を 100 にしていますが、大きな値にすればもっと円周率に近づきます。 さらに、被積分関数によっては台形則より誤差が小さくなったりするので、どちらがよいかは一概には言えません。 タグ: カテゴリー: , 更新日時: 2012-10-08 00:20.

次の

C言語のアルゴリズム(シンプソン公式)

シンプソン 公式

こちらもおすすめ! 画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。 なお、今回のプログラムは、あくまでアルゴリズム解説のためのサンプルコード的なものなので、 リッチなGUIの入力画面などはありません。 被積分関数やパラメータを変えたい場合などは、コード内の記述を直接書き換えてください ( または、上のおすすめリンクにある、をご利用ください )。 コードはVCSSLで記述されていますが、 適当に別の言語などに書き換えて使って頂いても構いません( と も下で掲載しています)。 [ 数値積分シリーズの連載記事 ]• 第1回:• 第2回:• 第3回: シンプソン法による数値積分(今回)• 応用 : 使用方法 ダウンロードと展開(解凍) まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされるので、その ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。 bat(種類はバッチファイル) 」をダブルクリック実行してください。 bat 」を実行してください。 2回目以降はすぐに起動します。 PC全体に影響する形でインストールされる事はありません。 また、コンソールに積分値も表示されます。 被積分関数やパラメータの変更など 被積分関数や積分区間、精度などを変えたい場合は、 プログラム「 IntegralSimpson. vcssl 」をテキストエディタで開いて、 コードを適当に書き換えてください。 そこで、前回までの内容を軽くおさらいしてみましょう。 なお、土台をしっかりと固めたいという方は、先に前回までの記事をご参照ください。 第1回:• イメージとしては下図の通りになります。 関数 f x と x 軸の間で囲まれた面積 = f x の積分値なので、この長方形の面積をすべて足しあげれば、積分値を近似的に求められます。 なので、積分の数式を手で解かなくても、プログラムで数値的にこの面積を求めてやれば、積分の値が求まるわけです。 第1回で扱ったでは、実際に 上の細長い長方形の面積を足し上げる事で、全体の面積( = 積分値 )を求めました。 でも、そうすると、どうしても 「 誤差 」が生じます。 これは上図からも明らかで、 領域の上端の線は本来はなめらかな曲線なのに、その領域を長方形を並べたもので強引に近似しているわけですから、 上端がギザギザになって、本来の曲線からはみ出ていたり欠けていたりする箇所が生じています。 これが大きな誤差の元になっていたわけです。 そこで第2回で扱ったでは、上図の 細長い長方形の部分を台形に置き換えて改良する事で、 はみ出たり欠けている部分を減らして、より高精度に全体の面積( = 積分値 )を求めました。 このイメージは下図の通りです。 このように、長方形の代わりに台形の面積をすべて足しあげれば、関数 f x と x 軸の間で囲まれた面積(つまり積分値)を、より高精度に求められるはずです。 上の図を見ただけでも、矩形法では上端の曲線からガタガタに外れていた部分が、台形法では大分ならされているので、誤差が一気に減りそうな事が直感的にわかります。 この違いは大きいですね。 現在のコンピューターは高速なので、計算時間等がそんなに気にならないなら、ある程度の精度まではその通りです。 しかしコンピューターでの数値計算は、本来は無限桁まで続く小数の値も、有限の桁数で打ち切って扱っているため、 実は四則演算などの基本的な計算を1回行うだけでも、その度に非常に小さな誤差が発生していたりします(データ型にもよります)。 なので、 あまり細長い微小領域を細かく刻みすぎると、その面積を足し上げる計算の回数が膨大になってしまって、 逆に上述のような別の誤差が蓄積する事により、ある程度以上は精度を上げられなくなってしまう場合もあります(矩形法で試すと分かりやすいです)。 よって、少ない計算の手数で、より高い精度を出せるなら、それに越した事は無いわけですね。 台形からさらに、誤差をどうやって軽減するか? 台形法から、もう一歩改良して、精度をさらに向上させてみましょう。 と言っても、大々的に複雑な改修をやるわけではないので、安心してください。 最終的に変更するのは、プログラムのコードだと、たったの1行です。 具体的には、 細長い微小領域の面積を計算していた部分です。 そう、結局は今回も前回同様、「微小領域の面積をいかに精密に求めるか」という話に尽きるわけですね。 それ以外の部分の考え方や処理の流れは、これまでとぜんぶ同じです。 それではまず、台形法の誤差の原因を見つめ直してみましょう。 細長く刻んだ微小領域( = いまは台形で近似 )を1個抜き出して注目します。 わかりやすくするために、f x のカーブの曲がり具合は先ほどの図よりも誇張しています。 微小区間を台形で近似した場合、上端の部分では、本来は曲線である f x を直線で近似する事になるため、正しい領域の面積と台形の面積との間に食い違いが生じます(図中のオレンジ色の部分)。 この過不足が台形法での誤差の根本原因です。 この微小領域の面積を足して、積分区間全体での面積を求め、それを積分値とするわけですが、その際にこの小さな過不足が積み重なって、最終的に積分値の誤差を生み出しているのです。 台形による近似だと、微小区間の上端が直線になっていましたが、そこに曲線を使えば、直感的にも誤差(=食い違い部分)が減って、より精度が上がりそうに思えます。 直感的にも、より欠けたりはみ出したりする部分が減り、誤差が減って精度が向上しそうですね。 そもそもそれが難しい( or 不可能な )場合のために、プログラムを書いてまでコンピューターに積分をやってもらおうとしているのでしたね。 ならどうするかと言うと、二次関数を使います。 二次関数は、下図にも示す通りシンプルな曲線で、そして高校などでも習うように、手でも厳密に積分できますね。 そしてそのカーブを多項式で近似する際、対象の領域が狭い(近傍の近似である)ほど、より低い次数の式で、よく近似できるようになるのが普通です。 ) 多項式を関数にフィットさせるための係数の選び方は、一般には色々あります。 ただ、あまり計算が複雑になるのも避けたいところです。 その際の微小領域の面積はとして簡単に表されます。 このように3点を通る二次関数は1通りに絞られて、ここでは割愛しますが、手計算で求められます。 そうすると、あとはその二次関数を積分すれば、細長い微小領域の面積が求まります。 要は、やで、 足し上げる中身が長方形や台形の面積だったのが、シンプソンの公式を使った二次関数近似の面積に置き換わっただけですね。 コード解説 それでは、実際にプログラミングで、シンプソン法により数値積分するコードを見ていきましょう。 このプログラムのコードはで記述されています。 VCSSLのコードは大体C言語っぽい感覚で読めると思います。 さて誤差は? それでは、このたった1行だけの変更で、どれだけ誤差が減るのか見てみましょう。 このプログラムを実行すると、まず積分過程がグラフで表示されます。 グラフに数式の値を重ね描きするには… 現在のVCSSL処理系で採用している2Dグラフソフトは「 リニアングラフ2D 」で、 データに数式を重ねてプロットする機能が付いています。 上では、その機能を使いました。 続いて表示されるウィンドウの「 f 」の入力欄に「 sin 」と入力し、 「 PLOT 」ボタンを押します。 グラフをものすご〜く拡大すれば一応は厳密値とのズレが見られますが、この水準になると、もう数値で直接ズレを見た方がわかりやすいでしょう。 という事でコンソールを見ると、以下のような内容が出力されているはずです: 0. 0 0. 0 0. 1 0. 09983342011429819 0. 2 0. 19866933769535547 … 0. 8 0. 7173561158151355 0. 9 0. 7833269368344314 1. 0 0. 8414710140343371 このように、a から b まで積分していっている最中の x 値が左の列、 その地点までの 積分値が右の列に出力されています(上で示したグラフでは、このデータを読ませてプロットしています)。 1行ごとに、積分値に微小領域1個の面積が足されています。 最後の行の積分値 0. 84147098480789650... 小数点以下 6 桁目から食い違っていますね。 この食い違いが誤差です。 という事は、シンプソン法で精度が一気に上がった事がわかりますね。 ちなみに、矩形法では小数点以下 2 桁目から違っていました。 この結果から、シンプソン法は 「 4次精度 」の数値積分アルゴリズムである事がわかります。 ところで、 前回扱った台形法は2次精度で、Nを1桁増やすごとに、合っている桁数が大体2桁くらいずつ増えるのでしたね。 また、 最初に扱った矩形法は1次精度だったので、1桁ずつしか増えませんでした。 一方で、4次精度を誇るシンプソン法を使えば、Nをちょっと増やすだけで一気に「4段飛ばし」で精度が増えていくわけです。 これらの数値積分法のプログラムのコードは、それぞれたった1行違うだけなのに、その実力差は歴然ですね。 このあたりから、「 計算アルゴリズムっておもしろいなー 」と感じてもらえると幸いです。 この類の誤差は演算をくり返すとじわじわ蓄積してくるので、 あまり極端に N を大きく設定したりすると、合っている桁数は逆に減ってしまったりもします。 数値積分などの、近似を用いた数値計算の精度には、アルゴリズム(計算方法)によって決まる本質的な近似の誤差と、 それとは別にコンピューター内での数値の扱いや演算のくり返しによって生じる誤差との、両方が影響してきます。 アルゴリズムの近似精度の次数が高いと、その妥協点を引き上げるのに有利になります。 [ 数値積分シリーズの連載記事 ]• 第1回:• 第2回:• 第3回: シンプソン法による数値積分(今回) 詳しいVCSSLのプログラミングガイド(無料)はこちらへ! 上記のコードはプログラミング言語VCSSLで記述されており、VCSSLのプログラミングガイドは下記で無料公開しています。 上記のコードを改造したい方や、新しいコードを書いてみたい方はぜひご活用ください! ブラウザで読めるWeb版だけでなく、PDF版も無料で配布しています! プログラミングの入門書に相当する内容です。 プログラミングが初めての方はこちらがおすすめです。 VCSSLの文法や基本的な機能を淡々とまとめた、リファレンスマニュアル的な位置づけのガイドです。 ボタンや入力項目などのGUI部品が並ぶ、画面を備えたVCSSLプログラムを開発するためのガイドです。 画面上や画像ファイルなどに、2次元的な描画を行うVCSSLプログラムを開発するためのガイドです。 画面上や画像ファイルなどに、3次元的な描画を行うVCSSLプログラムを開発するためのガイドです。 コード内で呼び出される関数は、大半が標準ライブラリのものです。 その詳細仕様を掲載しています。 ライセンス このVCSSLコード( 拡張子が「. vcssl」のファイル )は実質的な著作権フリー(パブリックドメイン である の状態で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。 txt 」をご参照ください。 この記事中の商標などについて• OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。 文中の社名、商品名等は各社の商標または登録商標である場合があります。 Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。 この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。 Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。 その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。 画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。 積分の値を数値的に求めます。 台形法よりも高精度な方法として、被積分関数を微小区間内で二次関数近似して求めた面積を足しあげる、シンプソン法を使用します。 積分の値を数値的に求めます。 長方形近似よりも高精度な方法として、台形で近似した微小領域を足しあげる方法を使用します。 積分の値を数値的に求めます。 長方形の短冊(矩形)で近似した微小領域を足しあげる、最も単純な方法を使用します。 小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換してくれるツールプログラムです。 試し割り法を用いて、素数判定を行ってくれる簡易ツールです。 3Dグラフを、Z軸まわりにゆっくりと回転アニメーションさせるツールです。 全角度のグラフを、連番の画像ファイルに保存する事もできます。 2019年10月09日 「VCSSL GUI開発ガイド」内のサンプルコードです。 ユーザーがGUIを操作した際に行う処理を実装します。 2019年07月28日 「VCSSL GUI開発ガイド」内のサンプルコードです。 色々な種類のGUI部品を画面上に配置します。 2019年07月28日 フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。 グラフを連番の画像ファイルに保存する事もできます。 2019年06月03日 フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。 グラフを連番の画像ファイルに保存する事もできます。 2019年05月24日.

次の