ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

C++

C++で固有値・固有ベクトルを求める (反復法)

n × n の正方行列 A と n次元のベクトル x について Ax = λx (ただし x ≠ 0) が成り立つとき λを固有値, x を固有ベクトルという. 最初に適当なベクトルx0から始めて xk+1 = Axk を反復すると xk は行列 A の最大固有値に対応する固有ベクトルに収束する. 固…

C++ で連立一次方程式を解く(修正コレスキー法)

行と列とを入れ替えても(転置行列)一致する行列を対称行列と言う. 修正コレスキー法では, 対称行列 を下三角行列 , 対角行列 , の転置行列 の積に分解し( ), から を求め, から を求める. #include <iostream> #include <iomanip> #include <math.h> using namespace std; void decomp(d</math.h></iomanip></iostream>…

C++ で連立一次方程式を解く(コレスキー法)

行と列とを入れ替えても(転置行列)一致する行列を対称行列と言う. コレスキー法では, 対称行列 を下三角行列 と, の転置行列 との積に分解し( ), から を求め, から を求める. #include <iostream> #include <iomanip> #include <math.h> using namespace std; void decomp(double a[4][</math.h></iomanip></iostream>…

C++ で連立一次方程式を解く(LU分解法)

連立一次方程式 を行列で表すと, こんな感じ このとき とすると, 最初の連立方程式は と表すことができる. このとき となる 上三角行列 , 下三角行列 を考えると, であり, とおくと となる.LU分解法では, 係数行列 を上三角行列 , 下三角行列 に分解し, から…

C++ で連立一次方程式を解く(ガウス・ジョルダン法)

考え方は, ガウスの消去法とほぼ同じ.連立一次方程式 が与えられた場合, まず(1)式を9で割って(1)'とする. (2)式から(1)'式に2を掛けたものを引くとの項が消える. (3)式に(1)'式を足すとの項が消える. (4)式から(1)'式を引くとの項が消える.ここまでは, ガウ…

C++ で連立一次方程式を解く(ガウスの消去法)

連立一次方程式 が与えられた場合, まず(1)式を9で割って(1)'とする. (2)式から(1)'式に2を掛けたものを引くとの項が消える. (3)式に(1)'式を足すとの項が消える. (4)式から(1)'式を引くとの項が消える.同様にして, 2番目の式を利用して, 3番目以降の式のyを…

C++ で連立一次方程式を解く(ガウス・ザイデル法)

考え方は、ヤコビ法とほぼ同じ. ヤコビ法の場合、漸化式で書くと だったが、2番目以降の式のの代わりに, 1番目の式で計算して得られたを使う. 同様に、3番目以降の式のの代わりに, 2番目の式で計算して得られたを使う. まとめると、 #include <iostream> #include <iomanip> #in</iomanip></iostream>…

C++ で連立一次方程式を解く(ヤコビの反復法)

例として を考える. この方程式を上から順に対角線上の変数について解くと となる. に適当な値を入れて右辺を計算し、 得られた値を新たなとして、計算を繰り返す. 漸化式で書くと #include <iostream> #include <iomanip> #include <math.h> using namespace std; void jacobi(double a</math.h></iomanip></iostream>…

行列の積 (C++)

#include <iostream> #include <vector> using namespace std; void multiply(vector< vector<double> > a, vector< vector<double> > b, vector< vector<double> >& c); int main() { cout << 'A' << endl; vector< vector<double> > a; vector<double> temp; temp.push_back(11); temp.push_back(12); temp.push_back(</double></double></double></double></double></vector></iostream>…

行列の積 (C++)

たとえば, 3行5列の行列と, 5行4列の行列との積は, 以下のように 3行4列の行列になる. 上記の場合, #include <iostream> using namespace std; void multiply(double a[3][5], double b[5][4], double c[3][4]); int main() { cout << 'A' << endl; double a[3][5] = {</iostream>…

C++で非線形方程式を解く (反復法 または 単純代入法)

非線形方程式の解法(反復法 または 単純代入法)を利用して2の平方根を求める 1. まず, 方程式 を, と変形する. 2. の値を として処理を繰り返して行くことで解を求める. ※ただし, 曲線 の傾きが, の傾きより小さくなければ 収束しない.例 を と変形しても…

C++で非線形方程式を解く (ベイリー法)

非線形方程式の解法(ベイリー法)を利用して2の平方根を求める 関数 をテイラー展開すると, と, 近似できる. この式を 左辺 , として変形すると, この式の右辺の をニュートン法で使った で置き換えると この式を漸化式として用いる. #include <stdio.h> #include <math.h> d</math.h></stdio.h>…

C++で非線形方程式を解く (はさみうち法)

非線形方程式の解法(はさみうち法)を利用して2の平方根を求める 考え方は、2分法とほとんど同じ. 1. まず, 条件 を満たす点 を考えると, 関数 の解は, 区間 の中に存在する. 2. 次に, 点 と 点 を結ぶ直線と 軸の交点 を考えると, であれば, 解は区間 の…

C++で非線形方程式を解く (ニュートン法)

非線形方程式の解法(ニュートン法)を利用して2の平方根を求める 1. まず, 関数 上の点 を考える. 2. 点 における の接線と 軸との交点 は より解に近づいている. 3. この作業を繰り返して行くことで解を求める.点 での接線の傾きは なので, この式を漸化式…

C++で非線形方程式を解く (2分法)

非線形方程式の解法(2分法)を利用して2の平方根を求める 1. まず, 条件 を満たす点 を考えると, 関数 の解は, 区間 の中に存在する. 2. 次に, 区間 の中点 を考えると, であれば, 解は区間 の中に存在し, 同様に, であれば, 区間 の中に存在する. 3. この…

C++で常微分方程式(ホイン法)

再度修正版 初速 250 km/h で, 45°の角度で打ったボールの軌跡をホイン法で計算する (空気抵抗係数を 0.01 で計算) 重力による鉛直方向の減速分は, 重力加速度を g, 時間を t とすると, 空気抵抗による水平方向の減速分は,速度を v, 速度の水平方向成分を vx…

C++で常微分方程式(中点法)

修正版 初速 250 km/h で, 45°の角度で打ったボールの軌跡を中点法で計算する (空気抵抗係数を 0.01 で計算) 重力による鉛直方向の減速分は, 重力加速度を g, 時間を t とすると, 空気抵抗による水平方向の減速分は,速度を v, 速度の水平方向成分を vx, 空気…

C++で常微分方程式(ルンゲ・クッタ・ギル法)

Amazon Top 2! ※修正版 初速 250 km/h で, 45°の角度で打ったボールの軌跡をルンゲ・クッタ・ギル法で計算する (空気抵抗係数を 0.01 で計算) 重力による鉛直方向の減速分は, 重力加速度を g, 時間を t とすると, 空気抵抗による水平方向の減速分は,速度を v…

C++で常微分方程式(ルンゲ・クッタ法)

※再度修正 参考 http://www.enjoy.ne.jp/~k-ichikawa/Satellite3.html 初速 250 km/h で, 45°の角度で打ったボールの軌跡をルンゲ・クッタ法で計算する (空気抵抗係数を 0.01 で計算) 重力による鉛直方向の減速分は, 重力加速度を g, 時間を t とすると, 空…

C++で常微分方程式(後退オイラー法)

初速 250 km/h で, 45°の角度で打ったボールの軌跡を後退オイラー法で計算する (空気抵抗係数を 0.01 で計算) #include <iostream> #include <iomanip> #include <math.h> using namespace std; // 重力加速度 const double g = -9.8; // 空気抵抗係数 const double k = -0.01; // 時間</math.h></iomanip></iostream>…

C++で常微分方程式(オイラー法)

初速 250 km/h で, 45°の角度で打ったボールの軌跡をオイラー法で計算する (空気抵抗係数を 0.01 で計算) 重力による鉛直方向の減速分は, 重力加速度を g, 時間を t とすると, 空気抵抗による水平方向の減速分は,速度を v, 速度の水平方向成分を vx, 空気抵…

C++で常微分方程式(ホイン法)

初速 150 km/h で, 45°の角度で投げたボールの軌跡をホイン法で計算する (空気抵抗を考慮しない) #include <iostream> #include <iomanip> #include <math.h> using namespace std; // 重力加速度 const double g = 9.8; // 水平方向の速度 double fx(double t, double vx) { // 水平方</math.h></iomanip></iostream>…

C++で常微分方程式(オイラー法)

初速 150 km/h で, 45°の角度で投げたボールの軌跡をオイラー法で計算する (空気抵抗を考慮しない) #include <iostream> #include <iomanip> #include <math.h> using namespace std; int main(void) { // 角度 double degree = 45; double radian = degree * M_PI / 180.0; // 初速 150</math.h></iomanip></iostream>…

C++で常微分方程式(オイラー法)

をオイラー法で近似する #include <iostream> #include <iomanip> #include <math.h> using namespace std; // 元の関数 double f(double x); // 導関数 double fd(double x); // Euler法 void euler(double x, double y, int n, double max); int main(void) { double x = 0.0; double </math.h></iomanip></iostream>…

C++で関数の近似(スプライン補間)

をスプライン補間で近似する複数の点が与えられているとき, これらを1つの多項式でつなげるのではなく, 2点ずつの区間に分けて, 小区間ごとに別々の3次式を設定する.(1) 連立1次方程式をたてる (2) 連立1次方程式を解いて si を求める(3) 区間 xi 〜 xi+1…

C++で関数の近似(スプライン補間)

LaTeX で出力してみた。 スプライン補間そのものの説明は、後日。 参考文献

C++で関数の近似(エルミート補間)

をエルミート補間で近似する2個の関数値 f(x0), f(x1) と,それぞれの微分係数f'(x0), f'(x1) とを 与えられたとき, 与えられた2個の関数値を通る53次式を求めるには, まず次のような表を作る. このとき, . あとは, ニュートン補間と同じ この式を使って,…

C++で関数の近似(ネヴィル補間)

をネヴィル補間で近似する与えられた5個の関数値 f(x0), f(x1), f(x2), f(x3), f(x4) と、 未知の点を通る4次式を求める場合, 次のような順序で計算する. (1) (2) (3) (4) (5) これらの式を使って, 与えられた点以外の点の値を求める. #include <iostream> #include <iomanip></iomanip></iostream>…

C++で関数の近似(ニュートン補間)

をニュートン補間で近似する与えられた4個の関数値 f(x0), f(x1), f(x2), f(x3) を通る3次式を求める場合, まず次のような表を作る. このとき, と定義する. これを x0とx1 の第1差分商, または1階差分商という. 同様に と定義し, これを x0, x1, x2 の第…

C++で関数の近似(ラグランジュ補間)

をラグランジュ補間で近似するn+1個の点 (x0, y0), (x1, y1) … (xn, yn) が与えられているとき, これらすべての点を通る n次式は次のように表すことができる. この式を使って, 与えられた点以外の点の値を求める. #include <iostream> #include <iomanip> #include <math.h> using names</math.h></iomanip></iostream>…