実現したいこと
誤差の計算、表示
前提
関数y=x^3-4x+1のa<=x<=bをn分割した際の最小値を求めるプログラムを書きました。
このコードの最後に、解析値と実際の値の誤差を計算し表示したいのですが、どうしたら良いかわかりません。
該当のソースコード
#include<stdio.h> #include<math.h> #include<stdlib.h> int main(int argc,char* argv[]){ if(argc != 4){ fprintf(stderr,"引数の数が違います\n"); exit(1); } float a = atof(argv[1]); float b = atof(argv[2]); int n = atoi(argv[3]); float min; float x = a; float delta = (b-a)/n; for(float i=a;i<=b;i+=delta){ float y = (i*i*i)-(4*i)+1; if(min>y){ min = y; x = i; } else{ min = min; x = x; } } printf("[x,y] = [%.4f,%.4f]\n",x,min); return 0; }
試したこと
表示する値と実際の値の誤差を調べるので、minの桁数を指定して演算できないかと思ったのですができませんでした。
補足情報(FW/ツールのバージョンなど)
x の範囲([a, b]) に依りますが、a > -2.3094, b > 1.1547 の場合(極小値点を含む)は、以下の式で求めることができるかと思います。(精度的に float よりは double や binary128 の方がよいかとは思いますが)
min - (sqrt(4.0/3.0) * (4.0/3.0 - 4.0) + 1.0)
例えば、「関数y=x^3-4x+1の1<=x<=2を10分割した際の最小値」の「実際の値」とは、以下のどれですか?
1. -2.072 (x=1.2の場合のyの値)
2. 1.2 ^ 3 - 4 * 1.2 + 1 をfloatの誤差ありで計算した結果
3. 1 - (16√3)/9 (x=(2√3)/3の場合のyの値)
4. 1 - (16√3)/9 をfloatの誤差ありで計算した結果
5. その他
floatでは1.2を正確には表現できないので、1.と2.は異なります。
また、√3は無理数なので、3.と4.も異なります。
もし、上記の答えが1.で、解析値の桁数指定で1.を求めることができると考えているのなら、それは間違いです。
分割数が10ではなく9の場合を考えれば、間違っていることが分かると思います。

回答1件
あなたの回答
tips
プレビュー