対象 Python及びNumPy初心者に向けて書いています. 「C言語は使えるけど最近Pythonを始めた」とか「Pythonらしい書き方がよくわからない」に該当する物理系の数値計算を目的とした方には特に有用かもしれません. また, 自分の不勉強のために間違った記述があるかもしれません. ご容赦ください. あらまし Pythonは数値計算系のライブラリが非常に充実しており, かつ使いやすくまとまっています. その多くはFortranで書かれた遺産のラッパーだったりするのですが, C/C++などから呼ぶよりもとても簡単です. 例えばC/C++からLAPACK1を呼んで固有値問題を計算しようとすると info = LAPACKE_zheevr(LAPACK_COL_MAJOR, 'V', 'A', 'L', H, (lapack_complex_double*)a, lda, vl, vu,
1. はじめに 本ページでは、精度保証付き数値計算を行うためにC++で作成した ライブラリ群を公開している。 特に非線形計算の精度保証を行うとき、template機能によって 複雑な数値型をすっきり記述でき、なおかつ "zero-overhead principle" で 計算速度が遅くならないC++は、非常に適していると言える (ほぼ唯一無二であると作者は考えている。)。 精度保証付き数値計算とkvライブラリの概要については、 このスライドを見て欲しい。 kv-intro.pdf (全84ページ) 2007年秋頃~2013年春頃の間は、区間演算を行うのにboostに含まれている intervalライブラリを用いて開発していたが、 boost.intervalは残念ながら不完全な部分が多く ライブラリ本体に手を入れざるを得なかった。 boost全体がアップデートする度にinterval部分
ハイエンドコンピューティング技術に関する調査研究II ―高性能プラットフォーム技術を中心とする― ↑の報告書は古いが、以下のページが高性能な科学計算用のテンプレートライブラリを作る時の参考になりそうなので、引用する。(見にくかったので、適当に整形した) ハイエンドコンピューティング技術に関する調査研究・ ―高性能プラットフォーム技術を中心とする― 他に、↓のページもとても参考になる。 高度にテンプレート化されたC++のコードがどれだけ最適化されるかを確かめてみる。 – muddy brown thang 【前へ】 3.4.4 科学計算におけるC++の状況 田中 義一委員 1.はじめに C++には、科学計算に魅力的な機能がいくつもある。テンプレートを使った汎化プログラミング、記述性の高い演算子の多重定義、コード再利用のためのオブジェクト指向的機能である。しかし、この魅力的機能にもかかわら
バビロニアの粘土板 YBC 7289 (紀元前1800-1600年頃)。2の平方根の近似値は六十進法で4桁、十進法では約6桁に相当する。1 + 24/60 + 51/602 + 10/603 = 1.41421296... [1]。(Image by Bill Casselman) 数値解析(すうちかいせき、英: numerical analysis)は、計算機代数(英語版)とは対照的に、数値計算によって解析学の問題を近似的に解く数学の一分野である。 (狭義には「数値解析」とは「数値計算方法」の数学的な解析・分析(mathematical analysis of numerical methods)のことであり,広義の意味=数値を使って問題の解析・分析を行う(Analysis by numerical methods)・式でなく数値で計算を行う「数値計算」(numerical comput
「数値計算と誤差」 計算機の中で数はどのように表現されているかを学ぶことで、計算アルゴリズムから生ずる誤差について学ぶ。 \begin{equation} x = \sum_{i=1}^{16} a_i \times 2^{i-1} \end{equation} ただし、負数との区別のために、$a_{16}=0$が条件。つまり、$x \le (2^{15} -1)$までしか正しく表現できない。 負数$x$は$(2^{16}-|x|)\ (\ge 0)$の正数として表現。これを2 の補数と呼ぶ。すると$a_{16}=1$。正数$a$と負数$b$(2の補数)の足し算を行う際に、正数の足し算回路を使うと、 \begin{equation} a + b \to a + (2^{16}-|b|) \to 2^{16} + (a+b) \end{equation} 最後は17ビット目を無視すると正しい
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCWZsb2F0IGVwcyA9IDFlLTQ7CglmbG9hdCBhID0gMSwgYiA9IDErZXBzLCBjID0gZXBzLzI7CglmbG9hdCBEID0gYipiIC0gNCphKmM7CgkKCWZsb2F0IHgxID0gKC1iICsgc3FydChEKSkvKDIqYSk7IC8vIOino+OBruWFrOW8j+OCkuebtOaOpeS9v+OBhuODkOODvOOCuOODp+ODswoJZmxvYXQgeDIgPSAoMipjKS8oLWIgLSBzcXJ0KEQpKTsgLy8g5YiG5a2Q5pyJ55CG5YyW44GX44Gf44OQ44O844K4
コンピュータ上で実数を表現する際には浮動小数点数を使うのですが、浮動小数点数の計算では誤差が発生します。 簡単な例を見てみます。 #include <cstdio> int main(void) { float a = 0.0; for(int i=0; i<10000; ++i) a += 0.01; printf("%.10f\n", a); } という0.01を10000回足すプログラムを実行すると結果は100.0029525757となり、期待される100.000000000に比べて0.003ほどの誤差が発生しています。 浮動小数点数計算での誤差を抑える一番簡単な方法はfloatではなくdoubleなどのより精度の高い型を使って計算精度を上げることですが、どうしても限界はあります。 他にも問題ごとにテクニックは存在しますが、誤差を完全に無くすことはできません。 正確な計算のためには誤
2011年09月24日00:01 カテゴリ流体力学アルゴリズム 流体力学のプログラムを作りたい!その1 素人が独学でやって書いた記事です。適宜参考文献リスト等も参照下さい。 対象の読者対象は個人ゲーム製作やCG関係で、流体の精度よりまずは動くプログラムが欲しい、学びたいという方。なので今回は一番単純で簡単な動く流体力学プログラムをつくろうと言うのが目標だ。 最終的に こんな感じのプログラムが動くところまでやる。 導入 まず2Dでも3Dでも流体力学で避けて通れないのはナビエストークスの式(NS式)([1]wikipedia より) (画像はwikipediaより) 左辺 - 第1項 : 時間微分項、第2項 : 移流項(対流項) 右辺 - 第1項 : 圧力項、第2項 : 粘性項(拡散項)、第3項 : 外力項 ちなみにこれでも簡単なほうらしい。これだけだと未知数が1つおおいままなので、∇・v =
オブジェクト指向 数値シミュレーションを求めて 私は理系の学校を出て、 現在はフリーランスエンジニアとして開発案件を受託しています。 社会に出て10年以上たちましたが、突然流体力学の勉強がしたくなりました。 それに合わせて、学生の頃から疑問に思っていた事を調べ直したり、 そういった事をこのサイトにまとめてみました。 数式で書かれた美しい法則をコンピューター上で動かしてみたい、 そしてそれにオブジェクト指向を応用したい、 そんなところを目指しています。 オブジェクト指向で流体解析コードを作ろう Javaについて とは何なのか とは何なのか 勉強の資料&リンク 私のプログラミングガイドライン プロフィール ご意見はこちらでお願いします。 当サイトはリンクフリーです。 Copyright(C) Since 2007 DeepDigital Co.,Ltd. All Rights Reserved
2点間の距離の計算では平方根が必要になりますが、平方根は少し重い計算です。ということで、平方根を使わず、掛け算・割り算・足し算と絶対値・最大・最小だけで距離を近似する方法についての記事を翻訳してみました。 flipcode - Fast Approximate Distance Functions (12:02 補足:おそらく今の標準的なCPUでやる意味はほとんどないと思います。近似のアプローチとして面白いというくらいの話。Z80でやりましょう) 距離関数高速近似 by Rafael Baptista (27 June 2003) 2点間のユークリッド距離を求める計算式は次のようになる。 二次元では次のようになる。 この関数の計算には、平方根が必要になる。これは最近のコンピュータでも高価な計算である。平方根は逐次近似によって求められる。つまり、コンピュータは平方根近似のループを行って、与え
有限桁 C言語で扱える実数値は,2進数の有限小数で表された数値である.例えば次のようなものである. 1.5(10) = 1.1(2) 3.25(10) = 11.01(2) 理論的には小数が無限に続く値でも,そのうちの有限個の桁数でその値を表すしかない. 例えば,0.1 を2進数の小数で表すと 0.1(10) = 0.000110011001100110011...(2) と無限に続くが,コンピュータの内部では有限桁で丸められている. このような場合には,本当の値ではなく,近似値でしか表すことができない. 指数表記(浮動小数点表記) 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 1234567890000000000000
数値計算の落とし穴 Last modified: この前計算機室にいたら,学生が「long ではなくて float を使うのかな」などと話しておりました。 # float より double を使ってくれ... コンピュータが用いる数の精度 コンピュータの内部で使用される数は,2進数で表される。 以下のプログラムを考えてみよう。 #include <stdio.h> #include <math.h> void put_float(char *string, float z); #define N 100 int main(void) { float x, sum; int i; sum = 0.0; x = 1.0/N; /* (1) */ for (i = 0; i < N; i++) { /* (2) */ sum += x; } put_float("sum = ", su
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く