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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

Q&A

0回答

1503閲覧

最小二乗法のアルゴリズムについて

_ion_

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

0グッド

0クリップ

投稿2020/07/10 13:41

編集2020/07/13 01:46

前提・実現したいこと

座標データをテキストファイルで読み込み
最小二乗法で近似曲線を計算プログラムを書いています。

発生している問題・エラーメッセージ

アルゴリズムが間違っているみたいで挙動がおかしいです。

該当のソースコード

下記に示したのが最小二乗法の計算アルゴリズムです。

C

1//ガウス消去法(連立方程式を解くため) 2int gauss(double **w, int n, int m, double eps){ 3 4 double y1; 5 double y2; 6 int ind = 0; 7 int nm; 8 int m1; 9 int m2; 10 int i; 11 int j; 12 int k; 13 14 nm = n + m; 15 16 for (i=0;i<n&&ind==0;i++) { 17 18 y1 = 0; 19 m1 = i+1; 20 m2 = 0; 21 22 for (j=i;j<n;j++) { 23 y2 = fabs(w[j][i]); 24 if (y1<y2) { 25 y1 = y2; 26 m2 = j; 27 } 28 } 29 30 if (y1<eps){ 31 ind = 1; 32 }else{ 33 for (j=i;j<nm;j++) { 34 y1 = w[i][j]; 35 w[i][j] = w[m2][j]; 36 w[m2][j] = y1; 37 } 38 39 y1 = 1.0 / w[i][i]; 40 41 for (j=m1;j<nm;j++){ 42 w[i][j] *= y1; 43 } 44 45 for (j=0;j<n;j++) { 46 if (j!=i) { 47 for (k=m1;k<nm;k++){ 48 w[j][k] -= w[j][i] * w[i][k]; 49 } 50 } 51 } 52 } 53 } 54 55 return ind; 56} 57 58//最小二乗法の関数 59double *least_squares_method(int m,int n,double *x,double *y){ 60 double **a;//可変長の配列 61 double **w;//可変長の配列 62 double *z;//可変長の配列 63 double x1; 64 double x2; 65 66 int sw; 67 int i; 68 int j; 69 int k; 70 71 m++; 72 z = new double[m]; 73 w = new double*[m]; 74 75 for (i=0;i<m;i++){ 76 w[i] = new double [m+1]; 77 } 78 a = new double * [n]; 79 80 for (i=0;i<n;i++) { 81 a[i] = new double [m]; 82 a[i][m-2] = x[i]; 83 a[i][m-1] = 1.0; 84 x1 = a[i][m-2]; 85 x2 = x1; 86 for (j=m-3;j>=0;j--){ 87 x2 *= x1; 88 a[i][j] = x2; 89 } 90 } 91 92 for (i=0;i<m;i++){ 93 for (j=0;j<m;j++) { 94 w[i][j] = 0.0; 95 for (k=0;k<n;k++){ 96 w[i][j] += a[k][i]*a[k][j]; 97 } 98 } 99 } 100 101 for (i=0;i<m;i++) { 102 w[i][m] = 0.0; 103 for(int j=0;j<n;j++){ 104 w[i][m] += a[j][i] * y[j]; 105 } 106 } 107 108 sw=gauss(w,m,1,1.0e-10); 109 110 if (sw==0) { 111 for (i=0;i<m;i++){ 112 z[i] = w[i][m]; 113 } 114 }else{ 115 z = NULL; 116 } 117 118 return z; 119} 120

試したこと

自分なりに考えてい見たのですが、間違えを発見することができませんでした。
質問回答お願いします。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

kazuma-s

2020/07/10 14:29

> 計算値が全然違うものになってしまいます。 入力データ、計算結果、期待する計算値を付けると、回答が得られやすいと思います。
RaitoN

2020/07/11 00:37

ソースコードは```で囲ってね.
fana

2020/07/13 01:36

「近似曲線」とだけ言われても…曲線の式くらいは示すべきでは?
_ion_

2020/07/13 01:37

申し訳ありません。 初心者なもので、、 もう少し詳しく書いてみます。
kazuma-s

2020/07/13 01:44

ソースコードの前の行に ```C、ソースコードの後の行に ``` を追加してください。 初心者でもできます。
kazuma-s

2020/07/13 02:21

最後の ``` の行はその 3文字だけですか? 先頭にスペースとか入っていませんか? それから、テスト用のデータは付けられませんか?
RaitoN

2020/07/15 11:20

```Cの後に改行を入れないとうまく表示されませんよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問