行列を作るとき、行列の成分を[0,1)上の乱数としたいです。

実現したいこと

100 種類の連立一次方程式 Ai*x = bi, i = 1, 2, . . . , 100 を単純 Gauss の消去法で解き,得られた近似解 xi に対する残差 2 ノルム ∥bi − Aixi∥2 や計算時間を求めたいです。このとき、行列サイズは 5 × 5とし,成分は右辺項も含めてすべて [0, 1) 上の乱数にしたいです。

発生している問題・分からないこと

自分が作ったコードはエラーが出ずに動くのですが、[0,1)上の乱数になっているのかがよくわかりませんでした。これは正しく実装できているのでしょうか。c++ではRAND_MAXを使うと[0,1)の範囲にならないという記事を見たのですが、改善の仕方がわかりません。また、この実装は1回しか行われないのですが、100種類調べたいので本当は100回繰り返したいです。どのように書けば良いのでしょうか。ご教示いただきたいです。よろしくお願いいたします。

該当のソースコード

c++

1//Gauss-消去法(帯行列、大きいサイズ)2 3#include <math.h>4#include <stdio.h>5#include <iostream>6#include "LinearAlgebra.hpp"7 8int main(){9 //ここでAとbどんなものか書く10 vector<vector<double> >A(5,vector<double>(5));11 vector<double> b(5);12 //vector<double> x(5);13 14 for(int i=0;i<5;i++){15 for(int j=0;j<5;j++){16 A[i][j]=(double)rand()/RAND_MAX;17 }18 b[i]=(double)rand()/RAND_MAX;19 }20 21 //行列Aを表示22 cout<<"A="<<endl;23 printMatrix(A);24 25 //ベクトルbを表示26 cout<<"b="<<endl;27 printVector(b);28 29 //前身消去した後のAとbを表示30 vector<double> x(5);31 32 x = GaussianElimination(A,b);33 34 //後退代入過程を用いた解xを表示35 cout<<"x="<<endl;36 printVector(x); 37}

試したこと・調べたこと

上記の詳細・結果

RAND_MAXを消すと[0,1)上になりませんでした。

補足

特になし

コメントを投稿

0 コメント