题目:试写出一个基于牛顿法的算法过程,实现给定实数C的k次方根。
关键词:牛顿法、实数开方、误差分析。
更多算法代码见:https://github.com/yxp123456/Algroithm_C
@附注:
Radicand--被开方数;
Precision--程序判断误差;
kth_Root--k次方根;
Fine--结果准确值值的最大偏离程度;(这里用到了deta和给定Precision值的关系,做了偏差分析)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/**************
本程序用于计算
任意给定实数C的k次方根
可以调节输出结果精度
**************/
double N_th_power (double num,int N);
int main ()
{
double radicand,precision = 0.0001,kth_root;//被开方数:radicand;误差:precision; k次方根:kth_root;
int k = 1,sign = 0; //sign符号位: 正数0 负数1 正+负2
printf ("$WLECOME TO USE THIS PROGRAM$\n");
printf ("Please type in the Radicand, the kth, the Precision:\neg: k√(C)\n");
REk:;
printf (">>k=");
scanf ("%d",&k);
if (k<0){
printf ("输入k值错误!(k应为非负整数)\n");
goto REk;
}
REradicand:;
printf (">>C=");
scanf ("%lf",&radicand);
if (radicand<0){
if(k%2 == 0){
printf ("输入radicand值错误!(暂时不支持复数运算)\n");
goto REradicand;
}else {
radicand *= -1;
sign = 1;
}
}else{
sign = 2;
}
kth_root = radicand;
printf (">>Precision=");
scanf ("%lf",&precision);
double deta = radicand,temp,fine;
while (deta>=precision){
temp = N_th_power(kth_root,k);
kth_root = kth_root - (temp-radicand)/(k*temp/kth_root);//牛顿法
deta = temp-radicand;
fine = kth_root/(radicand-precision)/k;//当前情况下距离精确解 的距离的上界
}
if (sign == 0){//输出符号判断
printf ("kth_root = %c%.17lf\n",'+',kth_root);
}else {
if (sign == 2){
printf ("kth_root_1 = %c%.17lf\n",'+',kth_root);
printf ("kth_root_1 = %c%.17lf\t",'-',kth_root);
}
if (sign == 1){
printf ("kth_root_1 = %c%.17lf\n",'-',kth_root);
}
}
printf ("fine = %.17lf",fine);//离正确值的最大偏离程度
printf ("\n@附注:\nRadicand--被开方数;\nPrecision--程序判断误差;\nkth_Root--k次方根;\nFine--结果准确值值的最大偏离程度;\n");
return 0;
}
double N_th_power (double num,int N)
{
int i;
double num_nthp = num;
for (i=1;i<N;i++){
num_nthp *= num;
}
return num_nthp;
}