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

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

ただいまの
回答率

89.09%

C++で前進代入、後退代入、gauss消去

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 163

yu3sukei22

score 6

//メインのコード
#include <stdio.h>
#include <iostream>
#include <math.h>
#include "LinearAlgebra.hpp"

int main(int argc,const char * argv[]){
    using namespace std;
    vector<vector<double> > A(3,vector<double>(3));//行列Aの設定
    A= {{3,-1,-1},{-1,3,-1},{-1,-1,3}};
    vector<double> b(3);
    b= {1,1,1};//ベクトルbの設定
    cout<<"A="<<endl;
    printMatrix(A);//Aを表示
    cout<<"b="<<endl;
    printVector(b);//bを表示
    vector<double> x(3);
    x=GaussianElimination(A,b);//gauss消去
    cout<<"x="<<endl;
    printVector(x);//Ax=bの解を出力```ここに言語を入力  
return 0;  
}  
//関数ファイルLinearAlgebra.cpp  
#include "LinearAlgebra.hpp"  
#include <vector>  
#include <math.h>  
#include <iostream>  
using namespace::std;  

//ベクトルaを出力  
void printVector(vector<double> a){  
for(int i=0;i<a.size();i++){  
printf("%.2e\t",a[i]);  
}  
printf("\n");  
}  

//行列Aを出力  
void printMatrix(vector<vector<double> > A){  
for(int i=0;i<A.size();i++){  
for(int j=0;j<A.size();j++){  
printf("%2e\t",A[i][j]);  
}  
printf("\n");  
}  
printf("\n");  
}  
//後退代入Ax=b  
vector<double> Backward_sub(vector<vector<double> > A,vector<double> b){  
int N=int(b.size());  
vector<double> x(N);  
for(int k=N-1;k>=0;k--){  
float C=0;  
for(int j=k+1;j<N;j++){  
C=A[k][j]*x[j];  
}  
x[k]=(b[k]-C)/A[k][k];  
}  
return x;  
}  
//gause消去  
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;  
//前進消去  
for(int k=0;k<N-1;k++){  
for (int i=k+1;i<=N;i++){  
int B=a[i][k]/a[k][k];  
for(int j=k+1;j<N;j++){  
A[i][j]=A[i][j]-A[i][k]*A[k][j];  
}  
b[i]=b[i]-A[i][k]*b[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;  
}  
//ヘッダーファイル LinearAlgebra.hpp  
#ifndef LinearAlgebra_hpp  
#define LinearAlgebra_hpp  

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

void printVector(vector<double>);  
void printMatrix(vector<vector<double> >);  
vector <double> VectorSubtract(vector <double>,vector <double>);  
vector <double> MatrixVector(vector<vector<double> >,vector <double>);  
vector <double> ResidualError(vector<vector <double> >,vector <double>,vector <double>);  
double VectorNorm1(vector <double>);  
double VectorNorm2(vector <double>);  
double VectorNormInfty(vector <double>);  
double MatrixNorm1(vector<vector <double> >);  
double MatrixNormIntfty(vector<vector <double> >);  
vector<double> GaussianElimination(vector<vector<double> > ,vector<double> );  
vector<double> Backward_sub(vector<vector<double> > ,vector<double> );  

#endif /* LinearAlgebra_hpp */  


コードを全て記載しておきます。行列AとベクトルbのAx=bの解xを求めるコードを作っています。
出力するとエラーが出てしまい、そのエラーコードが
main.cpp:9:8: error: expected expression
A= {{3,-1,-1},{-1,3,-1},{-1,-1,3}};
^
main.cpp:11:8: error: expected expression
b= {1,1,1};
^
となってます。教授にも質問しましたが、おそらくLinearAlgebra.cppのどこかが間違っていると思われます。
どのように修正すればいいか教えてくれると幸いです.
使ってるのはXcodeのversion11.5です

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • episteme

    2020/06/30 14:45

    https://teratail.com/questions/273681
    でベストアンサーつけたろ? 解決したんだろ?

    キャンセル

回答 2

checkベストアンサー

0

コンパイルエラーは出ませんが、GaussianElimination()の以下の箇所でi3のときにa[i],A[i],b[i]が範囲外アクセスしていますよ。

        for (int i = k + 1; i <= N; i++) {
            int B = a[i][k] / a[k][k];
            for (int j = k + 1; j < N; j++) {
                A[i][j] = A[i][j] - A[i][k] * A[k][j];
            }
            b[i] = b[i] - A[i][k] * b[k];
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

問題を再現できません。
Visual Studio 2019 でコンパイル/実行を確認しました。

A=
3.000000e+00    -1.000000e+00   -1.000000e+00
-1.000000e+00   3.000000e+00    -1.000000e+00
-1.000000e+00   -1.000000e+00   3.000000e+00

b=
1.00e+00        1.00e+00        1.00e+00


[追記]

教授にも質問しましたが、おそらくLinearAlgebra.cppのどこかが間違っていると思われます。

それが教授の返答だとしたら能無し教授だ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る