現在、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Java Java 年数計算 3 2023/01/28 10:52
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- 数学 N を2以上の自然数として,N 個のデータ{xn}を考える。以下の3条件が互いに同値であることを示し 1 2023/04/17 18:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
べき乗
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
演算子について
-
JAVAのプログラムで、2乗計算...
-
小数点以下の切捨てにつきまして
-
モンテカルロ法を用いた球の体...
-
ダイアログベースの3次Spline...
-
javaでC++のdefine文に相当する...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
VBAで配列の計算
-
JSPやサーブレットでSystem.out...
-
ダブルクォーテーションを含む...
-
COBOLで半角カナを全角カナに変換
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
大量のデータを読み込んで表示...
-
jsp/Servletの動的に増えるフォ...
-
配列にnullを代入すると、null...
-
パソコンキーボードで時分秒を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0dの意味を教えてください
-
べき乗
-
Javaで何パーセント%かを表示...
-
実数からの小数部の取得
-
double型変数値の整数部分のみ...
-
doubleとintの違い
-
最大値と最小値の求め方
-
double型の足し算について
-
少数50桁以上を表示するには
-
自然対数の底Eを含むStringの数...
-
printfでのエラーがわからない...
-
Java言語プログラミングについ...
-
モンテカルロ法を用いた球の体...
-
Javaプログラムのフローチャー...
-
Javaで計算
-
double型で収まりきれない小数...
-
JAVAのプログラムで、2乗計算...
-
フラクタルで雲を作る。
-
プログラムのおかしいところを...
-
Javaのeval関数処理
おすすめ情報