質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1580閲覧

ガウス(Gauss)消去法

Co-Min

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/15 16:51

A=({3 -1 -1},{-1 3 -1},{-1 -1 3})の3×3の行列とb=({1},{1},{1})のベクトルに対して前進消去を行い、後退代入によってAx=bの解を計算したいです。
//交代代入のアルゴリズム
//前進消去のアルゴリズム
のところ(【】の部分)を自分で書きましたがエラーが多すぎて何を直せばよいのかわかりません。その他のところは講義で公開されたものです。
また、講義でLinearAlgebra.cpp,LinearAlgebra.hppファイルを追加するとなっていたのですが、どういうことでしょうか。こちらもわかりましたら教えて頂きたいです。恐らくそれがないとprintMatrixなどが動かないのだろうとは予測しているのですが…
以下はコードです。

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;

//後退代入
vector<double> Backward_sub(vector<vector<double>> A, vector<double> b){
//Backward substiction Ax = b
int N = int(b.size());
vector<double> x<N>;
【//後退代入のアルゴリズム
for(int k = N; k > 0; k--){
double sigma = 0;
for(int j = k+1; j <= N; j++){
sigma += a[k][j]*x[j];
}
x = (b[k] - sigma) / a[k][k];
}】
return x;
}

//Gauss消去法
vector<double> GaussianElimination(vector<vector<double>> a, vector<double> c){
unsigned long N = c.size();
vector<Vector<double>> A(N,vector<double>(N));
vector<double> b(N);
A = a; b = c;
//前進消去
int i = 0;
int j = 0;
int k = 1; double alpha = 0;
【//前進消去のアルゴリズム
for(k = 1; k < N; k++){
for(i = k+1; i < N; i++){
alpha = a[i][k] / a[k][k];
for(j = k+1; j = N; j++){
a = a[i][j] - alphaa[k][j];
c = c[i] - alpha
c[k];
}
}
}】

cout<<"前進消去\n";
cout<<"A = "<<endl;
printMatrix(A);
cout<<"b = "<<endl;
printVector(b);
//後退代入
cout<<"後退代入\n";
vector<double> x(N);
x = Backward_sub(A, b);

return x;
}

int main(int argc, const char * argv[]){
vector<vector<double>> A(3, vector<double>(3));
A = {{3,-1,-1},{-1,3,-1},{-1,-1,3}};
vector<double> b(3);
b = {1,1,1};
cout<<"A = "<<endl;
printMatrix(A);
cout<<"b = "<<endl;
printVector(b);
vector<double> x(3);
x = GaussianElimination(A, b);
cout<<"x = "<<endl;
printVector(x);
return 0;
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

C++

1vector<double> Backward_sub(vector<vector<double>> A, vector<double> b){ 2 int N = int(b.size()); 3 vector<double> x<N>; // 正しくは X(N) 4 //後退代入のアルゴリズム 5 for(int k = N; k > 0; k--){ 6 double sigma = 0; 7 for(int j = k+1; j <= N; j++){ 8 sigma += a[k][j]*x[j]; // x[j] なんて要素あんのか? 9 } 10 x = (b[k] - sigma) / a[k][k]; // 左辺はvector / 右辺はdouble ⇒ 代入できるわけがない 11 } 12 return x; 13}

投稿2019/06/16 00:02

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Co-Min

2019/06/16 03:50

回答ありがとうございます。 左辺がvectorの場合、右辺はどのように書けばよいのでしょうか。教えていただけると幸いです。
episteme

2019/06/16 05:13

素直に考えれば x[k] 以外あり得ないべ?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問