
現在、Visual C++ 2008 Express Editionを使用して下に示すようなダイアログベースの3次Spline補間のプログラムを作成しています。
各節点間を等分割するほうはできたのですが、各区間を同一刻み幅で算出するほうが、なかなかできません。
どこをどうしたらいいかがさっぱりです。
以下にプログラムの一部(各区間を同一刻み幅で計算する部分)を示しますので、教えてください。
わからない点は、dnの配列に入ってくる分割数が合っているときと少ないときがあることです。プログラムの後に使用した入力データと、dnの中身を参考までに掲載します。
============▼プログラムの一部===========
/* n:全点数(int), num:全節点数(int),xn,yn:節点(double型のarray),dX:全区間(xn[0]~xn[num-1])の刻み幅(double)
* dn[]:各区間の分割数(int),xx,yy:Spline補間による点(節点を含む,double),x計算された補間点のx座標(double)
Cub(double):3乗する関数,Sqr(double):2乗する関数,a[],b[],c[],d[]:3次Spline補間に用いる3次関数の各係数*/
//nの初期化
n =0;
//テキストボックスから刻み幅を取得
dX = double::Parse(DX->Text::get());
//各区間の分割数を計算し、全点数を求める
for(i=0;i<num-1;i++){
dn[i]=(int)((xn[i+1]-xn[i])/dX);
n +=dn[i];
}
//xx,yyを全点数+1(最後の節点を含むために+1をしている)で領域確保
xx=gcnew array<double>(n+1);
yy=gcnew array<double>(n+1);
//ループインデックスを初期化
i=0,j=0;
//補間点のx座標を求めながらy座標を算出
for(x=xn[0];x<=xn[num-1];x+=dX){
if(!((xn[j]<=x)&&(x<xn[j+1]))){
j++;
}
if(i>n+1){
break;
}
xx[i]=x;
yy[i]=a[j]*Cub(xx[i]-xn[j])+b[j]*Sqr(xx[i]-xn[j])+c[j]*(xx[i]-xn[j])+d[j];
i++;
}
=======▼入力データ(csvファイル)===========
xn yn
0.904 7.54
1.002 13.86
1.104 23.42
1.207 36.61
1.305 52.91
1.403 73.4
1.505 97
1.603 123
1.706 151.3
1.808 182.6
1.906 215.3
2.009 249.2
2.107 284.6
2.209 321.6
2.312 359
2.41 398.1
2.571 438.7
2.669 504.9
2.772 548.3
2.869 593
2.972 639
3.075 687
3.172 736
3.275 787
3.378 840
3.476 895
3.578 951
3.676 1011
3.779 1073
3.876 1136
3.979 1204
4.077 1276
4.18 1353
4.277 1440
4.38 1543
4.483 1762
4.585 2082
4.683 3445
4.786 5598
4.888 7120
4.991 8080
=======▼dnの中身===========
Excelでの計算値 プログラムでの計算値
---------------------------------------
98 97
102 102
103 102
98 97
98 98
102 101
98 98
103 102
102 102
98 97
103 102
98 98
102 101
103 102
98 98
161 161
98 97
103 102
97 97
103 102
103 103
97 96
103 102
103 103
98 97
102 101
98 98
103 102
97 96
103 103
98 97
103 102
97 97
103 102
103 102
102 102
98 97
103 102
102 102
103 102
上の表の右側はダイアログ上で、「区間間隔」をクリック(各ラジオボタンをクリックすると右横のテキストボックスが入力できるようになります。)してテキストボックスに0.001を入れた時の結果です。

No.1ベストアンサー
- 回答日時:
intに変換する際の浮動小数点の誤差切捨てが発生しているのでしょう
for(i=0;i<num-1;i++){
dn[i]=(int)Math::Round( (xn[i+1]-xn[i])/dX), 0 );
n +=dn[i];
}
といった具合で丸めてみましょう
この回答への補足
あれから、ソ-スコードをいわれたとおり、修正したら無事できました。
小数点のところで、誤差が出ていたなんて思いもよらなかったです。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0dの意味を教えてください
-
べき乗
-
Javaで何パーセント%かを表示...
-
double型変数値の整数部分のみ...
-
プログラムのおかしいところを...
-
実数からの小数部の取得
-
java DAO 日付指定フォーマット...
-
オブジェクトの中のプロパティ...
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
<forEach> 内で供給された "ite...
-
ORA-01858: 数値を指定する箇所...
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
-
VB.net 引数で配列変数を渡す際...
-
C#の質問
-
system.out.printが出力されない
-
Log4jで機能毎に別ファイルへ出...
-
yyyymmddからyyyy/mm/d...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実数からの小数部の取得
-
double型変数値の整数部分のみ...
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
最大値と最小値の求め方
-
newton法のjacobi
-
プログラマーの達人という本の...
-
先に計算したほうがいいのでし...
-
べき乗
-
Javaによる利率計算の実装方法
-
java のfor文について質問です。
-
乱数について
-
x^2+y^2<n^2
-
LU分解を利用した逆行列のプロ...
-
分を表す数値(int型)を、小数...
-
プログラムで指数関数を求めよ...
-
double型の足し算について
-
Javaコンパイルエラー
-
掛け算演算を使わない掛け算
-
乱数のdouble型について
おすすめ情報