• ベストアンサー

線形補間

線形補間での求め方 問題文: 1.数値を読み込む 2.xを読み込む 3.x<x1 または x>xnならエラー 3.x1<x<i+1 となるiを見つける 4.補間公式でyを求める 5.結果をプリントする #include<stdio.h> float hokan(void); int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75}; double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573, 0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965}; int x=5; void main() { printf("y = %lf\n", hokan()); } float hokan(void) { int i; double y; if(x <0|| 75<= x){ printf("エラーです\n"); } else{ for(i=0; xn[i] < x; i++) y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; return y; } } 数表を最初にxnとynで表記しています。 このプログラムで線形補間が行われてないそうなのですが・・ 何か誤りがある様でしたらどなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.1

>数表を最初にxnとynで表記しています。 >このプログラムで線形補間が行われてないそうなのですが・・  どなたかに言われたのですか?。  その方は、x = 5; と「数表」にある既知の値(線形補間不要)を用いているから、そのことを揶揄して言ったのでは・・。   ☆ご自分で、「数表」にない値(例えば、x = 3 )で実行し、電卓での結果と比較してみては如何でしょう。

bubunn
質問者

お礼

恥ずかしながら・・課題提出の時に言われました。 もう期限は過ぎてるのですが、一応完全な形で出しておきたいと思い こちらに質問させていただきました。 最初の方と一緒にあわせて考えてみます。 ありがとうございます

その他の回答 (1)

noname#62605
noname#62605
回答No.2

まずプログラムのことに関してですが、x,xn[]とy,yn[]でサイズが異なるのですが、計算上危険なようなのでキャストするなりして型を統一したほうがいいです。 hokan()戻り値の設定がfloatで宣言しているのに、double型で返したら期待する結果は戻ってきません。 型とかを無視して机上で計算した結果は0.087でしたが、bubunnさんの実行結果はどうでしたか? この場合ですが、x==5ということもありループ内の処理は配列の要素が[0]の時だけしか動いていません。 継続条件:xn[i]<x 1回目 0<5なので成立→補間計算。 2回目 5<5なので不成立→ループ内の処理は行われず最後のyの値にてリターン。 配列のiは0しか実行できないのでyn[0]==0.000ですしxn[0]==0です。 したがって(型は無視します。)計算すると y=(0.087-0)*(5-0)/(5-0)+0.000 計算式の優先度順に計算すると y=0.435/5+0.000 y=0.087+0.000 y=0.087 となります。 もしこれ以外の結果になる場合はdoubleとintの型が合っていないので想定し得ない結果になっているという理由です。(理由は処理系内では10進で演算していないためです。) まずは型の見直し、補間条件x=5が妥当か?調べてみてください。

bubunn
質問者

お礼

そういう意味なのですね。 ありがとうございます!

関連するQ&A