ページ 11

Newton 法もしくは数値微分を利用した割線法を用いることによりaのn乗根を計算するプログラム

Posted: 2015年5月17日(日) 17:33
by abcd123
整数値n と小数値a を与えたとき,Newton 法もしくは数値微分を利用した割線法を用いることによりa のn乗根を計
算するプログラムを作れ.
という問題を解いています。
以下が自分の作成したプログラムですが、上手く動きません。
ご指摘お願いします。(Newton法を勘違いしているかも知れません・・・・。)

コード:

#include<stdio.h>

//累乗計算関数
double calc(int a, int b){
   if(b==0){
      return 1;
   }else{
      return a*calc(a,b-1);
   }
};

int main (void){
   double a,x;
   int n;

   //数値入力
   printf("Compute n th root of a:\n");
   printf("n=");
   scanf("%d",&n);
   printf("a=");
   scanf("%lf",&a);
  
   //計算
   x=3-(calc(3,n)-a)/(n*3);
   while(1){
      if(calc(x,n)-a<0){
         break;
      }
      x=x-(calc(x,a))/(n*x);

   //表示
   printf("%lf\n",x);

   return 0;
}

Re: Newton 法もしくは数値微分を利用した割線法を用いることによりaのn乗根を計算するプログラム

Posted: 2015年5月17日(日) 17:55
by みけCAT
・中括弧が足りない(コンパイルエラー)
・calc関数の実引数はdouble型なのに、仮引数はint型である。(そもそも標準ライブラリのpow関数ではいけなかったのか?)
・calc(x,n)-a<0という終了条件は適切か?(fabs(calc(x,n)-a)<1e-7などの間違いではないか?)
・そもそも

f(x)=pow(x,n)-a
f'(x)=n*pow(x,n-1)

f'(x)の近似値(数値微分) = (f(x+d)-f(x))/d (dは適当な小さい数)

Newton法 : x_{n+1} = x_{n} - f(x_{n}) / f'(x_{n})
割線法 : x_{n+1} = x{n} - f(x_{n}) * (x_{n} - x_{n-1}) / (f_{x_n} - f_{x_{n-1})

に相当しそうな式が見当たらない

というあたりが怪しいと思います。

Re: Newton 法もしくは数値微分を利用した割線法を用いることによりaのn乗根を計算するプログラム

Posted: 2015年5月17日(日) 18:38
by abcd123
指摘を受け、色々変えてみたところほぼ上手く言ったのですが、最後の一桁が合いません;;
問題ではnに10、aに3.0を代入して、1.116123174033905が表示されればよいと書いてありますが、
私が同じように代入した結果、1.116123174033904と表示され、一番最後の一桁だけあっていませんでした。
これはどのようにすれば解決できるでしょうか?

コード:

#include<stdio.h>
 
//累乗計算関数
double calc(double a, int b){
   if(b==0){
      return 1;
   }else{
      return a*calc(a,b-1);
   }
};
 
int main (void){
   double a,x;
   int n;
 
   //数値入力
   printf("Compute n th root of a:\n");
   printf("n=");
   scanf("%d",&n);
   printf("a=");
   scanf("%lf",&a);
  
   //計算
   x=3-(calc(3,n)-a)/(n*calc(3,n-1));
   while(1){
      if(calc(x,n)-a<=0){
         break;
      }
      x=x-(calc(x,n)-a)/(n*calc(x,n-1));
    }

   //表示
   printf("%16.15lf\n",x);
 
   return 0;
}

Re: Newton 法もしくは数値微分を利用した割線法を用いることによりaのn乗根を計算するプログラム

Posted: 2015年5月17日(日) 18:53
by みけCAT
abcd123 さんが書きました:指摘を受け、色々変えてみたところほぼ上手く言ったのですが、最後の一桁が合いません;;
問題ではnに10、aに3.0を代入して、1.116123174033905が表示されればよいと書いてありますが、
私が同じように代入した結果、1.116123174033904と表示され、一番最後の一桁だけあっていませんでした。
これはどのようにすれば解決できるでしょうか?
諦めるのがいいかもしれません。
1.116123174033905が表示されればよいと書いてあっても、1.116123174033905が表示されないとダメとは限りません。(ある命題とその裏の真偽は必ずしも一致しない)
また、Wolfram|Alphaで3^(1/10)を計算すると、
1.116123174033904434442614138377092581118316925350683788711901...
となったので、1.116123174033904の方が1.116123174033905より真の値に近いです。

Re: Newton 法もしくは数値微分を利用した割線法を用いることによりaのn乗根を計算するプログラム

Posted: 2015年5月17日(日) 18:56
by abcd123
わかりました(笑)
いろいろとありがとうございます!