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

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

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

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

Q&A

解決済

1回答

1827閲覧

C++でヤコビ法(反復法)

yu3sukei22

総合スコア8

C++

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

0グッド

0クリップ

投稿2020/07/07 10:06

c++

1#include <stdio.h> 2#include<iostream> 3#include<math.h> 4#include"LinearAlgebra.hpp" 5 6int main(int argc,const char * argv[]){ 7 using namespace std; 8 int M=100;//最大反復回数 9 int N=M; 10 double C=0; 11 vector<double> b(N); 12 vector<vector<double> > A(N,vector<double>(N)); 13 vector<double> x(N); 14 double epsilon=pow(10,-8); 15 int a=5; 16 for(int i=0;i<N;i++){ //行列Aの設定 17 for(int j=0;j<N;j++){ 18 double p=i-j; 19 if(i==j){ 20 A[i][j]=a; 21 } 22 else if(fabs(p)<=2){ 23 A[i][j]=-1; 24 } 25 else{ 26 A[i][j]=0; 27 } 28 } 29 } 30 for(int i=0;i<N;i++){ //ベクトルbの設定 31 b[i]=1; 32 }//bの設定終了 33 for(int i=0;i<N;i++){ //ベクトルxの初期設定 34 x[i]=1; 35 } 36 for(int m=0;m<M;m++){ //反復法 37 for(int i=0;i<N;i++){ 38 for(int j=0;j<N;j++){ 39 vector<double> K=x; 40 if(i!=j){ 41 double C=C+A[i][j]*x[j]; 42 } 43 x[i]=(b[i]-C)/A[i][i]; 44 double F; 45 F=VectorNormInfty(VectorSubtract(K,x))/VectorNormInfty(x); 46 M++; 47 if(F<=epsilon){ 48 printVector(x); 49 break; 50 } 51 } 52 } 53 printf("収束しない"); 54 } 55 return 0; 56}

c++

1//ベクトルの無限ノルム 2double VectorNormInfty(vector<double> a){ 3 double norm = 0 ; 4 for( int i=0; i<a.size();i++){ 5 if(norm<fabs(a[i])){ 6 norm = fabs(a[i]) ; 7 } 8 } 9 return norm; 10} 11 12//ベクトルa-bを計算し,結果を返す 13vector<double> VectorSubtract(vector<double> a,vector<double> b){ 14 unsigned long n = a.size(); 15 vector<double> c(n); 16 for(int i = 0 ; i<n ; i++){ 17 c[i] = a[i]-b[i] ; 18 } 19 return c ; 20}

ヤコビ法でAx=bの解を求めます。
起動はできましたがコードを間違えており無限に出力されますどこを直せばいいかわかりません

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

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

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

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

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

guest

回答1

0

ベストアンサー

doubleは不要です。
同名の変数を宣言してしまい、ifの外のCの値が0のまま変化しません。

C++

1 if (i != j) { 2 double C = C + A[i][j] * x[j]; 3 }

投稿2020/07/07 10:40

編集2020/07/07 10:45
SHOMI

総合スコア4079

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

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

yu3sukei22

2020/07/07 14:28

解決しましたあるがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問