实现给定实数的k次方根,基于牛顿法(迭代)实现。(C语言)

8 篇文章 0 订阅
1 篇文章 0 订阅

题目:试写出一个基于牛顿法的算法过程,实现给定实数Ck次方根

关键词:牛顿法、实数开方、误差分析。

更多算法代码见: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;
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值