如果有时间,我会渐渐的把数值分析的实验写完。总共8个实验,今天写的是方程求根里的通过牛顿迭代法求一元多次方程的根。

若函数f(x)连续可导,将f(x)在点x_k 处进行一阶泰勒展开,有:

令 f(x) = 0, 当f'(x_k) != 0 时,有:

于是,我们可以得到迭代公式:

关于牛顿迭代法了解到这就行了, 既然有了迭代公式,最主要的是如何通过编程实现它。

一.输入

既然是解方程,方程是必须输入的。但方程不可能原样的输入,所以我们要找到我们所需要的 必要信息:各项的系数、最高次幂、以及我们手动取的一个近似值

系数和当前项的幂可以通过一个数组来解决。数组是种有序的线性结构,元素在里面是顺序存放的,所以从高次到低次顺序输入就可以了。为了方便,即使系数是0,0也需要输入,不能省略。输入最高次幂是为了分配数组空间和之后的计算服务的。

二.计算f(x) 、f`(x)

牛顿迭代法的关键就是迭代公式,迭代公式的关键就是计算函数值和函数导数的值。

这里很简单,理清思路就可以了:

// f(x)、f`(x)

double f(double x, double *a, int n){

double res = 0;

int i;

for(i = 0; i <= n; i++){

res += a[i] * pow(x, n - i);

}

return res;

}

double ff(double x, double *a, int n){

double res = 0;

int i;

for(i = 0; i <= n; i++){

res += a[i] * (n - i) * (n - i - 1 >= 0 ? pow(x, n - i - 1) : 0);

}

return res;

}

注意一下f`(x)的计算,如果套用前面的求导方法就会出错。最后常数项应该单独处理,常数项的导数为0。

三.不断迭代到合适的精度

迭代过程就是一个不断逼近准确根的过程,所以在精度已经足够好了,也就是说 x_k 和 x_k + 1 差值足够小的时候,结束迭代就可以了。

// 初始时令last != x_k, 并保存x的值

x_first = (last = x_k + 1) - 1;

// 前后两次差值 < 0.00001 就结束循环

while(fabs(x_k - last) > 0.00001){

last = x_k;

x_k = last - f(last, a, n) / ff(last, a, n);

}

四.例题 && 测试

图片来自 《计算方法(李桂成)》

测试

五.完整代码(C语言)

C代码:

// 牛顿迭代法求一元n次方程根

#include

#include

#include

// f(x)、f`(x)

double f(double x, double *a, int n){

double res = 0;

int i;

for(i = 0; i <= n; i++){

res += a[i] * pow(x, n - i);

}

return res;

}

double ff(double x, double *a, int n){

double res = 0;

int i;

for(i = 0; i <= n; i++){

res += a[i] * (n - i) * (n - i - 1 >= 0 ? pow(x, n - i - 1) : 0);

}

return res;

}

int main(){

// n次幂、存储各项系数的数组a、循环变量i

int n;

double *a;

int i;

// x_k

double x_k, last, x_first;

// 输入n次幂

printf("输入方程的次幂:");

scanf("%d", &n);

// 为a分配空间

a = (double*) malloc(sizeof(double) * (n + 1));

// 输入各项系数

printf("输入方程各项系数(从高次到低次):");

for(i = 0; i <= n ; i++){

scanf("%lf", a + i);

}

// 开始秀

printf("输入x的初始值:");

scanf("%lf", &x_k);

// 初始时令last != x_k, 并保存x的值

x_first = (last = x_k + 1) - 1;

// 前后两次差值 < 0.00001 就结束循环

while(fabs(x_k - last) > 0.00001){

last = x_k;

x_k = last - f(last, a, n) / ff(last, a, n);

}

// 输出求得的根

printf("方程在x = %.1lf 附近的根为:%.5lf", x_first, x_k);

// end

getchar();

return 0;

}

迭代法求根c语言程序对数方程,【实验一】方程求根:牛顿迭代法相关推荐

  1. c语言程序设计 简述操作系统管理文件的方法,C语言程序设计基础实验.doc

    C语言程序设计基础实验.doc 实验1 熟悉c语言程序的开发环境 1.1 实验目的 (1)熟悉Code::Blocks等C语言程序的开发环境. (2)掌握C程序的编辑.编译.连接和运行方法. (3)通 ...

  2. 周信东c语言实验二实验报告,周信东主编最新版C语言程序设计基础实验一实验报告.doc...

    周信东主编最新版C语言程序设计基础实验一实验报告.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我 ...

  3. 《C语言程序设计基础》第2章作业,清华大学出版社-图书详情-《C语言程序设计基础实验与题解》...

    C语言是国内外广泛使用的一种程序设计语言,也是初学程序设计人员的首选入门程序设计语言.C语言具有表达能力强.代码质量高和可移植性好等特点,既具有高级语言的特点,又具有汇编语言的优点,越来越受到人们的欢 ...

  4. 陈东方 c语言程序设计基础实验与题解(答案),C语言程序设计基础实验与题解 黄远林 陈东方 李顺新...

    商品描述: 注意啦:旧书库存不准确经常断货,为保证您的利益,拍前请务必联系卖家咨询库存情况.     对于未事前进行咨询直接付款的买家,本店有权拒绝发货.请知悉    !                ...

  5. c语言实验报告周信东,周信东主编最新版c语言程序设计基础实验一实验报告

    周信东主编最新版c语言程序设计基础实验一实验报告 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 24.9 积分 --WORD格式--可编辑--专业资 ...

  6. 周信东c语言实验二实验报告,周信东主编最新版-C语言程序设计基础实验一实验报告...

    周信东主编最新版-C语言程序设计基础实验一实验报告 实验1 C程序的运行环境和最简单的C程序设计 学号: 姓名:莫新锋 实验日期: 2018.10.23 一. 实验目的和要求 (1)熟悉C语言程序开发 ...

  7. R语言应用uniroot函数求解方程的根(一元解):仿真数据(方程式可视化、并添加y=0的水平横线)、uniroot函数求解方程的根(并添加方程根对应的垂直竖线)

    R语言应用uniroot函数求解方程的根(一元解):仿真数据(方程式可视化.并添加y=0的水平横线).uniroot函数求解方程的根(并添加方程根对应的垂直竖线) 目录

  8. 计算方法实验:方程求根二分法、不动点迭代法、牛顿法

    计算方法实验一,方程求根 分别用Matlab和C写了一下,初学Matlab,如有不足还请指正. 实验内容: 1)在区间[0,1]内用二分法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ...

  9. c语言程序个人实验报告,C语言程序设计实验报告(5)

    C程序设计实验报告五 实验项目:6.3.1-1.6.3.1-2.6.3.1-3.6.3.1-4.6.3.2-1.6.3.3-1 姓名:蔡鹏 实验地点:家中 实验时间:2020.04.22 一.实验目的 ...

  10. c语言程序三角形实验报告,C语言程序设计实验报告五

    C程序设计实验报告四 姓名:赖玮 实验地点:家 实验时间:2020.04.23 一.实验目的与要求 1.熟练地掌握函数的定义方法和调用规则. 2.掌握在C语言程序中主调函数和被调用函数之间进行数据传递 ...

最新文章

  1. 贪心:Burst Balloons 最少次数完成射击气球
  2. spring-redis-data的一个坑
  3. linux中html的图片显示不出来,如何在HTML中显示原始的rgb图像
  4. 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~
  5. 刚毕业的我,参与了一场大厂之间的争夺之战
  6. Laravel 错误处理
  7. python time模块详解
  8. word转换成pdf java代码_java代码实现word转换成pdf
  9. Fiddle:使用断点:bpu,bpafter
  10. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用
  11. 手动处理MNIST手写数据集的逻辑斯蒂回归算法实践
  12. java实验目的_java实验报告一
  13. 企业员工人事管理系统(数据库课设)
  14. 【蜻蜓Dragonfly】client部署
  15. Are You a Software Architect?
  16. AirtestIDE1.2.13的安卓手机设置自动初始化功能
  17. Arduino定义数组,求数组长度,
  18. vant文件上传Uploader图片压缩
  19. 一个很好用的gif动态图控件:GifImageView
  20. 众安保险今日正式招股,保险如何结合科技打造新经济?

热门文章

  1. [Math] 二阶行列式和三阶行列式的几何意义的证明
  2. dhuacm出题网站搭建
  3. 三维模型重建(1):关于三维模型重建的一些简介
  4. 怎样看开源代码版权_版权声明在开源代码中泛滥成灾
  5. JS短文 | 3分钟了解下 JS Sets 集合
  6. 手机内存文件夹html,手机内存难清理?试试直接删掉这3个文件夹,网友:咋不早说?...
  7. 最新发布:数据库防火墙技术市场调研报告
  8. 阿里云服务器配置docker及其使用
  9. 乐鑫Esp32学习之旅 17 全网首发,esp32 sdk直连京东微联·小京鱼·IoT开放平台,实现叮咚音响语音智能控制。
  10. 小学生计算题生成器的python实现