ラベル 数値計算 の投稿を表示しています。 すべての投稿を表示
ラベル 数値計算 の投稿を表示しています。 すべての投稿を表示

2017年7月15日土曜日

GDによるグラフ描画(最小二乗法による直線近似)

libgd によるグラフ描画の例題です(最小二乗法による直線近似)。

文字列画像の作成 にて用意したフォントを用い、sin関数により生成したデータのグラフを作成しています。

graphInit 関数にてグラフ作成時のオプションを指定していますが、グラフの横幅(graw)、縦幅(grah)、余白(padding)、グラフ描画オプション(DrawType BASE_UNDER:最小値を基準としてグラフを作成する BASE_ORIGIN:原点を基準としてグラフを作成する)等を指定できます。
genData の type にて最大値や最小値が異なるデータを生成していますが、グラフは枠内に収まるよう自動的にスケーリングして描画され、縦横軸のラベルもそれに応じて描画されます。

データのグラフ化のついでに、最小二乗法による直線近似も行っています。グラフ化に用いるデータから傾き、切片を計算し、近似する直線を描いています。 実行結果 genData(type=0)にて原点を基準にして作成したグラフ

2011年9月25日日曜日

基数値を指定し、x 進数の文字列として出力

2進数、8進数、10進数、16進数等の基数値を指定し、与えられた値を x 進数の文字列として出力する例題です。

例題では、4095 = 0xFFF(16進数)のように 0 から 9 の文字列で表現できない部分はアルファベット A から Z で表現していますので、基数の最大値は 36 となります。

実行結果

結果を文字列として取得する例

最大値、最小値の計算例

ファイルからデータを読み取り、データの最大値、最小値を計算する例です。

最大/最小値を計算する際、データを読み取る度に値を比較し、比較した値が大きい/小さい場合に値を格納する変数(maxv/minv)が必要となりますが、この変数の初期化には注意が必要です。
読み取るデータの全ての値より大きい/小さい場合には、正しく最大値/最小値が計算されませんので、想定されるデータの値より大きい/小さい値にて初期化する必要があります。
例題では、変数タイプに合わせた最大値/最小値(float.h: DBL_MAX)にて初期化を行なっています。

また、データを比較する際、(a < minv) や (a > maxv) のように直接値を計算すると、ただしく大小の比較が行われない場合があります。
そこで、下記のように差分値が 0 より大きいか、小さいかを調べることにより改善を図っています。

実行結果

2011年9月9日金曜日

円同士の当たり判定

三平方の定理により、円同士が重なるかどうかを判定する当たり判定の例です。

実行結果

全ての順列、組み合わせを配列として取得

全ての順列、組み合わせを配列として取得する例題です。

配列は nPr/nCr/nΠr/nHr の数だけ必要になるため、必要な数を計算し配列を準備し、その配列内に結果を格納しています。
C++/STL で簡単に行う方法はこちら

順列 (Permutation): 異なるn個から順序を考えてr個を選ぶ。
組み合わせ (Combination): 異なるn個から順序を考えずにr個を選ぶ。
重複順列 (Repeated permutation): 異なるn種類から順序を考えてr個を選ぶ。
重複組み合わせ (Repeated combination): 異なるn種類から順序を考えずにr個を選ぶ。
実行結果

2011年9月7日水曜日

Newton 法による平方根の解法

Newton 法により平方根を求める解法の例です。


とし、value の平方根を求めます。

初期値の与え方により計算回数が異なりますので、初期値には乱数を与え、毎回異なるようにしています。

実行結果

2011年9月6日火曜日

素因数分解

素因数分解の例です。

例題では、計算された係数を配列に保存し、結果が元の数値と一致するかを確認するための計算を更に行っています。 実行結果

ユークリッドの互除法による最大公約数の計算

ユークリッドの互除法による最大公約数の計算例です。

減算(enclidGCD1)による方法と、剰余(euclidGCD2)による方法がありますが、剰余による計算の方が計算回数が少ないことが分かります。

実行結果

2011年9月2日金曜日

DegreeからRadianへの変換

マクロを利用したDegreeからRadianへの変換例です。

実行結果

2011年7月4日月曜日

体積の計算

半径、高さを入力し、円柱の体積を計算する例題です。


実行結果

2011年7月3日日曜日

実数データの入力&加算、平均値の計算

実数データを入力し、加算・平均値を計算する例題です。

実行結果

階乗の計算

再帰呼び出しを用いない階乗の計算例です。


実行結果

2011年5月15日日曜日

2直線の交点の計算

y=ax+b で定義される2直線をランダムに生成し、その2直線が交わる交点 (x,y) を求める例題です。

反復により一番誤差の少ない点を求める方法と、セカント法による方法を比較しています。
(逆行列を計算してと言う方法もありますが、ここでは単純な計算例ということで。。)

セカント法は、非線型方程式(f(x)=0)の解を求める手法ですが、f(x) の定義部に当たる nw_func() の定義を修正すれば直線方程式の解を求めることもできます。

例題では、両手法の反復回数、探索範囲を同じにしていますが、セカント法の方が誤差を小さく計算できていることが分かります。

実行結果

基礎統計量の計算

統計に必要となる基礎的な統計量の計算と標準化されたデータ列に対する統計量の計算例です。

実行結果

2項分布による確率計算

2項分布を参考に例題を用意しています。

2項分布
次の1~3を満たす試行をベルヌーイ試行という。

1. 各試行において、その事象が発生するか否かのみを問題にする。
2. 各試行は統計的に独立する。
3. 対象とする事象が発生する確率は、各試行を通じて一定である。

1 回の試行において、ある事象 X が発生する確率を p とする。
n 回のベルヌーイ試行列において、ちょうど i 回事象 X が発生する確率は、

で表され、このとき X の確率分布を2項分布といい、X 〜 B(n,p) と表す。

例題
1. 2項分布 B(8,0.4), B(8,0.2) の確率分布を求めよ
2. プラモデルが25セットあり、そのうち2セットは部品がかけているとする。客が任意に3セット選ぶとき、いずれも完全なセットである確率を求めよ
3. ある試薬をネズミに注射すると一定期間のうちに 40% が死亡するという。8匹のネズミにその試薬を注射した場合、
(a) 8匹全部が一定期間以上生存する確率を求めよ
(b) 95% の確率で,8匹のうち何匹以上が生存するということができるか
実行結果

相関行列(係数)の計算

2つの変量から相関係数を計算し、相関行列を計算する例題です。

2つの確率変数(変量)x と y の関連性を調べるために、n 組のデータ (x1,y1),...,(xn,yn) から次式によって(標本)相関係数 rxy を計算します。



例題では、変量 x1 と x3 の相関係数が 0.616 となり、x2 との相関より高いことが分かります。

実行結果

2011年5月7日土曜日

2次方程式の解法

2次方程式の解を得る例題です。

引数により与えられたパラメータにより2次方程式を規定し、その方程式の解を計算します。

実行結果

組合せ数 (nCr) の計算

組合せ数(nCr)の計算例です(漸化式、Pascalの3角形による方法)。

n 個の数から r 個を選択する場合の組合せ数を計算します。
通常、組合わせ数 nCr は以下のような漸化式により計算することができます。

また、重複がある場合の組合せ数は以下のように計算することができます。

例では、選択する数に重複がある場合とない場合(選択する数が同じでも順番のみが異なっている場合)に分けて計算しています。

重複がある場合には値が非常に大きくなってしまうため、どの辺までオーバーフローなく計算できているか、若干疑問です。
漸化式による計算と、Pascal の方法による計算を比較していますが、Pascal の方法による計算の方が、加算により計算しているのでオーバーフローは少ないかと思われます。

全ての順列、組み合わせを配列として取得する例は、こちら

実行結果

相関係数の計算

相関係数の計算例です。



相関係数を計算する数値列が同じ場合、相関係数は 1 となり、
相関係数を計算する数値列の符号が逆の場合、相関係数は -1 となります。

相関行列の計算は こちら

実行結果

ビットシフトによる掛算

ビットシフトによる掛算の例題です。

計算をループさせ、通常の掛け算との計算時間を比較していますが、通常の計算の方が早くなっています。
また、単純なビットシフトにより2の冪乗の計算も行っていますが、pow 関数による計算の方が早くもなっています。

特殊な計算が必要な場合以外には、掛け算として用いるのは得策ではないようです。


実行結果