非线性方程求根迭代法
来源:互联网 发布:福州趣读网络 编辑:程序博客网 时间:2024/04/30 07:31
一、写在前面
实验目的
(1) 熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法
(2) 能编程实现简单迭代法,牛顿迭代及牛顿下山法
(3) 认识选择迭代格式的重要性
(4) 对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响
实验内容
**本次实验参考公式**
二、实验过程
【参考代码】
#include <stdio.h>#include <stdlib.h>#include <math.h>double IterationFunction(double x) //迭代函数{ return pow(x+1.0, 1.0/3);}double function(double x) //原函数 f(x){ return x*x*x-x-1;}double derivativeFunction(double x) //导函数 f'(x){ return 3*x*x-1;}double Iteration(double x0, double e, int N) //一般迭代算法//输入参数: x0 初值, e 精度, N 最大迭代次数{ int k = 0; //当前迭代次数 double x1; //终值 printf("--------------------------一般迭代算法过程----------------------------\n"); printf("k = %d: x%d = %lf\n", k, k, x0); while(k < N) { x1 = IterationFunction(x0); k++; printf("k = %d: x%d = %lf\n", k, k, x1); if(fabs(x1-x0) < e) //判断是否达到精度,满足要求结束程序,否则继续迭代 return x1; x0 = x1; } return 0; //迭代失败:迭代次数超过最大迭代次数,精度未达到要求}double AitkenAccelerate(double x0, double e, int N) //Aitken加速算法//输入参数: x0 初值, e 精度, N 最大迭代次数、{ int k = 0; double x1, x2, x3; printf("--------------------------Aitken加速算法过程----------------------------\n"); printf("k = %d: x%d=%lf\n", k, k, x0); while(k < N) { x1 = IterationFunction(x0); //迭代 x2 = IterationFunction(x1); //迭代 x3 = x2 - (x2-x1)*(x2-x1)/(x2-2*x1+x0); //改进 k++; printf("k = %d: x%d(-)=%lf, x%d(~)=%lf, x%d=%lf\n", k, k, x1, k, x2, k, x3); if(fabs(x3-x0) < e) return x3; x0 = x3; } return 0;}double Newton(double x0, double e, int N) //Newton算法{ int k = 0; double x1; printf("---------------------------Newton算法过程---------------------------\n"); printf("k = %d: x%d = %lf\n", k, k, x0); while(k < N) { if(0 == derivativeFunction(x0)) //分母不可为0 return -1.999999; //导函数值为0,返回-1.999999作为错误标志 x1 = x0 - function(x0)/derivativeFunction(x0); //使用Newton迭代函数 k++; printf("k = %d: x%d = %lf\n", k, k, x1); if(fabs(x1-x0) < e) return x1; x0 = x1; } return 0;}double NewtonDown(double x0, double e, int N) //Newton下山算法{ int k = 0; double x1; double down = 1.0; //下山因子 printf("---------------------------Newton下山算法过程---------------------------\n"); printf("k = %d: x%d = %lf\n", k, k, x0); while(k < N) { if(0 == derivativeFunction(x0)) //分母不可为0 return -1.999999; //导函数值为0,返回-1.999999作为错误标志 down = 1.0; x1 = x0 - down*function(x0)/derivativeFunction(x0); //使用Newton迭代函数 while(fabs(function(x1)) >= fabs(function(x0))) { down /= 2; //下山因子减半 x1 = x0 - down*function(x0)/derivativeFunction(x0); } k++; if(down <= 0.0000001) { printf("下山失败,没有找到合适的下山因子,请另选初值\n"); return 0; } printf("k = %d: x%d = %lf, 下山因子 = %lf\n", k, k, x1, down); if(fabs(x1-x0) < e) return x1; x0 = x1; } return 0;}int main(){ double answer; answer = Iteration(0.6, 0.000001, 20); //在此将迭代次数设置尽可能大,不考虑迭代失败的情况 printf("一般迭代算法求得最终结果: x = %lf\n\n", answer); answer = AitkenAccelerate(1.5, 0.000001, 10); printf("Aitken加速算法求得最终结果: x = %lf\n\n", answer); answer = Newton(0.6, 0.000001, 20); printf("Newton算法求得最终结果: x = %lf\n\n", answer); answer = NewtonDown(0.6, 0.000001, 20); printf("Newton算法求得最终结果: x = %lf\n\n", answer); return 0;}
三、实验结果
四、写在后面
经历了几次有关数值分析的程序编写之后,有了一定的将数学知识转化为程序的能力,但是一些高级的算法还是得有较厚的数学功底,利用数学解决实际工程问题才是最终的目的,希望在这条道路上有所成长。
0 0
- 非线性方程求根迭代法
- 不动点迭代法 一元非线性方程求根 C语言实现
- 牛顿迭代法 一元非线性方程求根 C语言实现
- Matlab非线性方程求根
- 非线性方程求根
- 斯特芬森加速迭代法(Steffensen)-埃特金方法(Aitken) 一元非线性方程求根 C语言实现
- solve it--非线性方程求根
- (matlab系列)非线性方程求根
- 数值分析4 非线性方程求根
- 计算方法 实验二 非线性方程求根
- 方程求根(二分法和牛顿迭代法)
- 用牛顿的迭代法求解非线性方程
- 牛顿迭代法解非线性方程(组)
- 牛顿迭代法解非线性方程matlab实现
- matlab-非线性方程求根函数及函数曲线绘制
- 计算方法实验二实验报告 非线性方程求根
- 工程计算2——非线性方程求根
- 二分法 一元非线性方程求根 C语言实现
- LeetCode:414. Third Maximum Number
- javaSE_07Java中类和对象-封装特性
- 21天精通java基础之Day19调用指定的属性方法构造器
- Nao机器人B-human安装1
- Privacy Policy
- 非线性方程求根迭代法
- Driver:硬件原理补充(2)
- 浅谈for,for-in,forEach,for-of几种循环
- Swi-Prolog 数值约束
- git failed paths dirty_worktree
- 4.7
- 树形dp(IOI 2005河流代码理解)
- Struts2入门案例
- 蓝桥杯—2017模拟