方程的求解

一、非线性方程的求解

1、牛顿迭代法。牛顿迭代法的思想是根据函数f(x)的泰勒基数的前几项来寻找方程的根。牛顿迭代法具有平方收敛的速度。

f(x)=f(x0)+f(x0)(x-x0)+...(泰勒公式展开式)

根据泰勒公式展开式的前两项有:

f(x)=f(x0)+f(x0)(x-x0)=0

如果f(x0)不等于0则:

x1=x0-(f(x0)/f(x0))

这样通过x0得到了x1,然后根据x1进行下一次相似的计算,这样就得到牛顿法的一个迭代序列公式:

xn+1=xn-(f(xn)/f(xn))

具体代码如下:

 1 /*
 2  * @author
 3  * 非线性方程的表达式
 4  */
 5 double function(double x) {
 6     return x * x * x * x - 3 * x * x * x + 1.5 * x * x - 4;
 7 }
 8
 9 /*
10  * @author
11  * 非线性方程的导函数
12  */
13 double dFunction(double x) {
14     return 4 * x * x * x - 9 * x * x + 3 * x;
15 }
16
17 /*
18  * @author
19  * 牛顿迭代算法
20  * precision为算法的精度,maxGen为最大迭代次数,x为一个地址变量,
21  * 算法刚开始赋值给x是一个初始值,并不是最终的结果,故利用地址变量,方便
22  * 将最后的结果赋值给x
23  */
24 int newtonMethod(double *x, double precision, int maxGen) {
25     double temp, t;
26     int i = 1;
27     temp = *x;
28     if (dFunction(temp) == 0.0) {
29         printf("Error! The derivative is zero\n");
30         return 0;
31     }
32     while (i <= maxGen) {
33         t = temp - (function(temp) / dFunction(temp));
34         if ((fabs(t - temp) < precision)
35                 || (fabs(function(temp)) < precision)) {
36             *x = t;
37             return 1;
38         } else {
39             temp = t;
40         }
41         i++;
42     }
43     printf("the number of iteration over maxGen!\n");
44     return 0;
45 }

2、二分法

二分法的思想:如果函数f(x),在x=c时,f(c)=0,那么把x=c称为函数f(x)的零点。对于二分法,假定非线性方程f(x)在区间(x,y)上连续,如果存在两个实数a,b属于区间(x,y),使得满足如下式子:

f(a)*f(b)<0

也就是说f(a),f(b)异号,这说明在区间(a,b)内一定有零点,可以根据f((a+b)/2)来判断方程解的位置,具体代码如下:

 1 double function(double x) {
 2     return 2 * x * x * x - 5 * x - 1;
 3 }
 4 /*
 5  * @author
 6  * 这里将negative 表示函数值小于零的自变量,positive表示函数值大于0的自变量
 7  */
 8 int dichotomy(double *x, double negative, double positive, double precision) {
 9     double mid, temp;
10     if (function(negative) > 0)
11         positive = negative;
12     if (function(positive) < 0)
13         negative = positive;
14     mid = (positive + negative) / 2;
15     temp = function(mid);
16     if (temp > 0) {
17         positive = mid;
18     } else {
19         negative = mid;
20     }
21     if (fabs(negative - positive) > precision) {
22         dichotomy(x, negative, positive, precision);
23     } else {
24         *x = temp;
25         printf("The result of x is %0.5f\n", mid);
26     }
27     return 0;
28 }
29 /*
30  * 另一种二分法的表示方法
31  */
32 double erfen(double a, double b, double precision) {
33     double c;
34     c = (a + b) / 2.0;
35     while ((fabs(function(c)) > precision) && (function(a - b) > precision)) {
36         if (function(c) * function(b) < 0) {
37             a = c;
38         }
39         if (function(c) * function(a) < 0) {
40             b = c;
41         }
42         c = (a + b) / 2.0;
43     }
44     return c;
45 }
时间: 2024-11-09 06:36:19

方程的求解的相关文章

递推方程的求解

递推方程的求解 其实这是本人<算法设计与分析>课程回顾的内容整理,用来测试一下cnblogs上的markdown和数学公式支持...... 什么是递推方程? 对于序列\(a_0,a_1,a_2, -,a_n\),简记为\({a_n }\),一个把\(a_n\)与若干个\(a_i (i<n)\)联系在一起的等式叫做关于序列\({a_n}\)的递推方程. 为什么要学习求解递推方程? 因为对递归算法的分析离不开递推方程的求解 例如,Hanoi塔问题递归算法为: Hanoi(A, C, n):

Riccati方程迭代法求解

根据上述迭代法求解P,P为Riccati方程的解,然而用LQR需要计算K,再将K算出. (迭代过程中 ,我们可以将此算法和dlqr函数求解的参数进行对比,当误差小于我们设置的允许误差我们就可以把此算法替换掉dlar函数) 今天我又把离散和连续混在一起了,以后要万分注意,避免bug 原文地址:https://www.cnblogs.com/niulang/p/9197897.html

[Matlab]求解线性方程组

转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”.如: X=A\B表示求矩阵方程AX=B的解: X=B/A表示矩阵方程XA=B的解. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理. 如果矩阵A不是方阵,其维数是m×n,则有: m=

改变人类历史的17大数学方程

在笔者看来,宇宙中的通用语言有两种,一种是数学,另一种是艺术.数学以最简洁的方式,把复杂的宇宙现象和规律淋漓尽致的展现出来,正所谓宇宙不言,大美如斯!2013 年,数学家和科普作家 Ian Stewart 发表了他的著作——<改变世界的 17 个方程>,向大家诠释了人类历史上最伟大的 17 个方程. 现在,我们就一起来欣赏一下宇宙最美的语言! 1.勾股定理 勾股定理想必大家再熟悉不过了,这是数学里最基本的公式之一,描述的是直角三角形三条边长的关系.“勾三股四弦五”读起来可谓朗朗上口. 2.对数

17大数学方程

17大数学方程 在笔者看来,宇宙中的通用语言有两种,一种是数学,另一种是艺术.数学以最简洁的方式,把复杂的宇宙现象和规律淋漓尽致的展现出来,正所谓宇宙不言,大美如斯!2013 年,数学家和科普作家 Ian Stewart 发表了他的著作——<改变世界的 17 个方程>,向大家诠释了人类历史上最伟大的 17 个方程. 现在,我们就一起来欣赏一下宇宙最美的语言! 1.勾股定理 勾股定理想必大家再熟悉不过了,这是数学里最基本的公式之一,描述的是直角三角形三条边长的关系.“勾三股四弦五”读起来可谓朗朗

为何高于四次的方程没有根式解?

转载知乎上的回答. 可能不少人上学的时候都曾对这个问题感兴趣,至少我是一个.无意间在知乎上看到这个问题,又勾起了自己的兴趣,然后就上网.找书钻研了一番.我不是学数学的,我对问题的理解肯定有不准确的地方,所以这里算不上回答了这个问题,只是把自己的心得和大家分享一下.虽然里面有比较多的公式和概念,希望是比较好懂的,能对同样感兴趣的人有点启发. 先来一个简单的说明.整数通过加减乘除得到有理数,有理数没有填满实数轴,其中还有间隙,即存在着无理数.将有理数进行扩展,四项运算之外,再加上开方运算,经过这样计

ceres求解BA第10章

1.前言g2o是根据边来保存每一个代价函数,它是在边类中构造误差函数,构造边的时候,会设置顶点.测量值.协方差矩阵等.而在ceres中,用problem类型来构造最终的目标函数.先是使用AddResidualBlock来添加代价函数,代价函数和核函数等构造成目标函数.在ceres中,代价函数就是误差项,目标函数是由很多误差项的范数的平方再各自乘以核函数除以2得到的.2.定义代价函数类型,定义其create成员来使用ceres当中的AutoDiff特性所谓的定义代价函数类型是定义了一个Snavel

C语言之基本算法24—黄金切割法求方程近似根

//黄金切割法! /* ================================================================ 题目:用黄金切割法求解3*x*x*x-2*x*x-16=0的根. ================================================================ */ #include<stdio.h> #include <math.h> #define E 1e-8 double hs(doub

C语言之基本算法24—黄金分割法求方程近似根

//黄金分割法! /* ================================================================ 题目:用黄金分割法求解3*x*x*x-2*x*x-16=0的根. ================================================================ */ #include<stdio.h> #include <math.h> #define E 1e-8 double hs(doub