非线性方程组求解的牛顿迭代法用MATLAB实现

合集下载

牛顿迭代法解非线性方程组(MATLAB版)

牛顿迭代法解非线性方程组(MATLAB版)

⽜顿迭代法解⾮线性⽅程组(MATLAB版)⽜顿迭代法,⼜名切线法,这⾥不详细介绍,简单说明每⼀次⽜顿迭代的运算:⾸先将各个⽅程式在⼀个根的估计值处线性化(泰勒展开式忽略⾼阶余项),然后求解线性化后的⽅程组,最后再更新根的估计值。

下⾯以求解最简单的⾮线性⼆元⽅程组为例(平⾯⼆维定位最基本原理),贴出源代码:1、新建函数fun.m,定义⽅程组1 function f=fun(x);2 %定义⾮线性⽅程组如下3 %变量x1 x24 %函数f1 f25 syms x1 x26 f1 = sqrt((x1-4)^2 + x2^2)-sqrt(17);7 f2 = sqrt(x1^2 + (x2-4)^2)-5;8 f=[f1 f2];2、新建dfun.m,求出⼀阶微分⽅程1 function df=dfun(x);2 f=fun(x);3 df=[diff(f,'x1');diff(f,'x2')]; %雅克⽐矩阵3、建⽴newton.m,执⾏⽜顿迭代过程1 clear;clc2 format;3 x0=[0 0]; % 迭代初始值4 eps = 0.00001; % 定位精度要求5for i = 1:106 f = double(subs(fun(x0),{'x1''x2'},{x0(1) x0(2)}));7 df = double(subs(dfun(x0),{'x1''x2'},{x0(1) x0(2)})); % 得到雅克⽐矩阵8 x = x0 - f/df;9if(abs(x-x0) < eps)10break;11 end12 x0 = x; % 更新迭代结果13 end14 disp('定位坐标:');15 x16 disp('迭代次数:');17 i结果如下:定位坐标:x =0.0000 -1.0000迭代次数:i =4。

MATLAB应用 求解非线性方程

MATLAB应用 求解非线性方程

第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x )1-n 1-n 1n 0,是n+1项之和在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算设有两个多项式n a +⋯⋯++=x a x a x a p1(x )1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x )1-m 1-m 1m 0。

它们的加减运算实际上就是它们的对应系数的加减运算。

当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。

当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。

例2 计算()()1635223-+++-x x x xa=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例 3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐 f+g1, f-g1三、多项式的乘法运算conv(p1,p2)例4 在上例中,求f(x)*g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3];conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。

Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3];[Q, r]=deconv(f, g)五、多项式的导函数p=polyder(P):求多项式P 的导函数p=polyder(P ,Q):求P ·Q 的导函数[p,q]=polyder(P ,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。

matlab牛顿迭代法求方程

matlab牛顿迭代法求方程

一、引言在数值计算中,求解非线性方程是一项常见的任务。

牛顿迭代法是一种常用且有效的方法,它通过不断逼近函数的零点来求解方程。

而在MATLAB中,我们可以利用其强大的数值计算功能来实现牛顿迭代法,快速求解各种非线性方程。

二、牛顿迭代法原理与公式推导1. 牛顿迭代法原理牛顿迭代法是一种利用函数的导数信息不断逼近零点的方法。

其核心思想是利用当前点的切线与x轴的交点来更新下一次迭代的值,直至逼近方程的根。

2. 公式推导与迭代过程假设要求解方程f(x)=0,在初始值x0附近进行迭代。

根据泰勒展开,对f(x)进行一阶泰勒展开可得:f(x) ≈ f(x0) + f'(x0)(x - x0)令f(x)≈0,则有:x = x0 - f(x0)/f'(x0)将x带入f(x)的表达式中,即得到下一次迭代的值x1:x1 = x0 - f(x0)/f'(x0)重复以上过程,直至达到精度要求或者迭代次数上限。

三、MATLAB中的牛顿迭代法实现1. 编写函数在MATLAB中,我们可以编写一个函数来实现牛顿迭代法。

需要定义原方程f(x)的表达式,然后计算其一阶导数f'(x)的表达式。

按照上述推导的迭代公式,编写循环语句进行迭代计算,直至满足精度要求或者达到最大迭代次数。

2. 调用函数求解方程在编写好牛顿迭代法的函数之后,可以通过在MATLAB命令窗口中调用该函数来求解具体的方程。

传入初始值、精度要求和最大迭代次数等参数,即可得到方程的近似根。

四、牛顿迭代法在工程实践中的应用1. 求解非线性方程在工程领域,很多问题都可以转化为非线性方程的求解问题,比如电路分析、控制系统设计等。

利用牛顿迭代法可以高效地求解这些复杂方程,为工程实践提供了重要的数值计算手段。

2. 优化问题的求解除了求解非线性方程外,牛顿迭代法还可以应用于优化问题的求解。

通过求解目标函数的导数等于0的方程,可以找到函数的极值点,从而解决各种优化问题。

非线性方程组求解的牛顿迭代法用MATLAB实现

非线性方程组求解的牛顿迭代法用MATLAB实现

非线性方程组求解的牛顿迭代法用MATLAB实现首先,我们需要定义非线性方程组。

假设我们要求解方程组:```f1(x1,x2)=0f2(x1,x2)=0```其中,`x1`和`x2`是未知数,`f1`和`f2`是非线性函数。

我们可以将这个方程组表示为向量的形式:```F(x)=[f1(x1,x2);f2(x1,x2)]=[0;0]```其中,`F(x)`是一个列向量。

为了实现牛顿迭代法,我们需要计算方程组的雅可比矩阵。

雅可比矩阵是由方程组的偏导数组成的矩阵。

对于方程组中的每个函数,我们可以计算其对每个变量的偏导数,然后将这些偏导数组成一个矩阵。

在MATLAB中,我们可以使用`jacobi`函数来计算雅可比矩阵。

以下是一个示例函数的定义:```matlabfunction J = jacobi(x)x1=x(1);x2=x(2);J = [df1_dx1, df1_dx2; df2_dx1, df2_dx2];end```其中,`x`是一个包含未知数的向量,`df1_dx1`和`df1_dx2`是`f1`对`x1`和`x2`的偏导数,`df2_dx1`和`df2_dx2`是`f2`对`x1`和`x2`的偏导数。

下一步是实现牛顿迭代法。

牛顿迭代法的迭代公式为:```x(k+1)=x(k)-J(x(k))\F(x(k))```其中,`x(k)`是第`k`次迭代的近似解,`\`表示矩阵的求逆操作。

在MATLAB中,我们可以使用如下代码来实现牛顿迭代法:```matlabfunction x = newton_method(x_initial)max_iter = 100; % 最大迭代次数tol = 1e-6; % 收敛阈值x = x_initial; % 初始解for k = 1:max_iterF=[f1(x(1),x(2));f2(x(1),x(2))];%计算F(x)J = jacobi(x); % 计算雅可比矩阵 J(x)delta_x = J \ -F; % 计算增量 delta_xx = x + delta_x; % 更新 xif norm(delta_x) < tolbreak; % 达到收敛条件,停止迭代endendend```其中,`x_initial`是初始解的向量,`max_iter`是最大迭代次数,`tol`是收敛阈值。

MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告实验报告一、引言计算方法是数学的一门重要应用学科,它研究如何用计算机来解决数学问题。

其中,迭代法、牛顿法和二分法是计算方法中常用的数值计算方法。

本实验通过使用MATLAB软件,对这三种方法进行实验研究,比较它们的收敛速度、计算精度等指标,以及它们在不同类型的问题中的适用性。

二、实验方法1.迭代法迭代法是通过不断逼近解的过程来求得方程的根。

在本实验中,我们选择一个一元方程f(x)=0来测试迭代法的效果。

首先,我们对给定的初始近似解x0进行计算,得到新的近似解x1,然后再以x1为初始近似解进行计算,得到新的近似解x2,以此类推。

直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。

本实验将通过对复杂方程的迭代计算来评估迭代法的性能。

2.牛顿法牛顿法通过使用函数的一阶导数来逼近方程的根。

具体而言,对于给定的初始近似解x0,通过将f(x)在x0处展开成泰勒级数,并保留其中一阶导数的项,得到一个近似线性方程。

然后,通过求解这个近似线性方程的解x1,再以x1为初始近似解进行计算,得到新的近似解x2,以此类推,直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。

本实验将通过对不同类型的方程进行牛顿法的求解,评估它的性能。

3.二分法二分法是通过将给定区间不断二分并判断根是否在区间内来求方程的根。

具体而言,对于给定的初始区间[a,b],首先计算区间[a,b]的中点c,并判断f(c)与0的大小关系。

如果f(c)大于0,说明解在区间[a,c]内,将新的区间定义为[a,c],再进行下一轮的计算。

如果f(c)小于0,说明解在区间[c,b]内,将新的区间定义为[c,b],再进行下一轮的计算。

直到新的区间的长度小于规定的误差阈值为止。

本实验将通过对复杂方程的二分计算来评估二分法的性能。

三、实验结果通过对一系列测试函数的计算,我们得到了迭代法、牛顿法和二分法的计算结果,并进行了比较。

matlab迭代法求解方程

matlab迭代法求解方程

matlab迭代法求解方程在MATLAB中,可以使用迭代法来求解方程。

迭代法是一种通过反复迭代逼近方程解的方法。

下面我将从多个角度全面回答你关于MATLAB迭代法求解方程的问题。

首先,迭代法的基本思想是通过不断迭代一个初始猜测值,使得迭代序列逐渐趋近方程的解。

在MATLAB中,可以使用循环结构来实现迭代过程。

一般来说,迭代法需要满足收敛条件,即迭代序列能够收敛到方程的解。

常见的迭代法包括简单迭代法、牛顿迭代法和割线法等。

其次,我将介绍一种常见的迭代法——简单迭代法(也称为不动点迭代法)。

简单迭代法的基本思想是将方程转化为等价的不动点形式,即将方程f(x) = 0转化为x = g(x)的形式。

然后,通过迭代序列x_{n+1} = g(x_n)来逼近方程的解。

在MATLAB中,可以通过编写一个循环结构来实现简单迭代法。

下面是一个使用简单迭代法求解方程的MATLAB代码示例:matlab.function x = simple_iteration(g, x0, tol, max_iter)。

% 简单迭代法求解方程。

% 输入,g为迭代函数,x0为初始猜测值,tol为容差,max_iter为最大迭代次数。

% 输出,x为方程的解。

x = x0; % 初始猜测值。

iter = 0; % 迭代次数。

while abs(g(x) x) > tol && iter < max_iter.x = g(x); % 迭代计算下一个近似解。

iter = iter + 1; % 迭代次数加1。

end.if iter == max_iter.disp('迭代次数超过最大迭代次数,未找到解');else.disp(['迭代次数为,', num2str(iter)]);disp(['方程的解为,', num2str(x)]);end.end.在上述代码中,g为迭代函数,x0为初始猜测值,tol为容差,max_iter为最大迭代次数。

matlab中的迭代算法

matlab中的迭代算法

matlab中的迭代算法迭代算法在matlab中的应用迭代算法是一种通过多次重复计算来逼近解的方法,它在matlab中得到了广泛的应用。

在本文中,我们将介绍一些常见的迭代算法,并探讨它们在matlab中的实现和应用。

1. 二分法二分法是一种简单而直观的迭代算法,它通过将问题的解空间一分为二,并根据中间点的取值来确定解所在的子空间。

在matlab中,可以使用while循环来实现二分法。

首先,需要指定解空间的上下界,然后通过计算中间点的值来判断解所在的子空间,并更新解空间的上下界。

重复这个过程,直到解的精度满足要求为止。

2. 牛顿迭代法牛顿迭代法是一种用于求解方程的迭代算法,它利用函数的局部线性近似来逼近方程的解。

在matlab中,可以使用while循环来实现牛顿迭代法。

首先,需要给定一个初始点,然后根据函数的一阶和二阶导数来计算下一个点的值。

重复这个过程,直到解的精度满足要求为止。

3. 高斯-赛德尔迭代法高斯-赛德尔迭代法是一种用于求解线性方程组的迭代算法,它通过不断更新近似解来逼近方程的解。

在matlab中,可以使用while循环和矩阵运算来实现高斯-赛德尔迭代法。

首先,需要给定一个初始解向量,然后根据方程组的系数矩阵和常数向量来计算下一个解向量的值。

重复这个过程,直到解的精度满足要求为止。

4. 迭代法求特征值迭代法也可以用于求解矩阵的特征值和特征向量。

在matlab中,可以使用while循环和矩阵运算来实现迭代法求特征值。

首先,需要给定一个初始特征向量,然后根据矩阵的幂来计算下一个特征向量的值。

重复这个过程,直到特征向量的变化小于某个阈值为止。

5. 迭代法求最优化问题除了求解方程和矩阵相关的问题,迭代算法还可以用于求解最优化问题。

在matlab中,可以使用while循环和梯度计算来实现迭代法求最优化问题。

首先,需要给定一个初始解向量,然后根据目标函数的梯度来计算下一个解向量的值。

重复这个过程,直到解的精度满足要求为止。

牛顿迭代法解元方程组以及误差分析matlab实现

牛顿迭代法解元方程组以及误差分析matlab实现

举例,给定方程组为:先用matlab 自带函数solve 解此方程组,确定牛顿迭代时的初值范围,得到根为:⎩⎨⎧==8493476.0848937.108y x 作图验证: 此组值确为方程的根。

通过观察我们可以发现y 的取值必须大于0。

这在程序中必须说明,如果迭代过程中y 小于0,则此迭代法发散。

误差分析:因为范数等价的原因,我们选择2范数。

将两次相邻迭代差差范数的比值,即相对误的与,2x x n n 1+n x 的2范数作为误差,存储与一个向量或矩阵中,并作出曲线图,观察迭代过程中误差的变化情况。

如选初值为(12,0.3),得到误差图形为:选初值为(12,1.2),误差图为:我们可以发现误差在前3-5次迭代的时候迅速下降,但是中间会有上升的过程,直至最后误差达到我们设定的误差值。

由此猜想迭代过程可能漏掉了一些根,利用作图,得到曲线如下:可以发现还有两组根,用牛顿迭代法只能得到一组值,可能是因为所给方程比较特殊,它的定义域中x,y 均不能为0,导致函数不连续。

另外,也可能因为函数不连续,导致初值只能在根的附件变化时才能得到收敛的结果。

因此我们不妨将初值选的稍微小一些,如:[1,2],得到根为选初值为[-1,4],得到根为综上所述,此方程组有三组根,不同的初值,会得到不同的解的情况,也会有不同的误差情况。

初值选得越接近真值,误差变化程度越小,迭代次数也越少。

程序在另三个附件中。

同理,对于n元函数方程组,我们有:.n .)('.)],...,(),...,,...,,([)(.n 1n )(')(.,...,,0],...,;......;,...,,[),...,,()(...)()(........),...,,()(...)()()()()(1)()(2)(11)()()1()()()()1(21112111)1(1012200201n 0202)1(2101)1(1002011102102)1(21101)1(1有限时的解编程,依然可以得到类似二元方程组,那么利用牛顿迭代法,为系数矩阵是一行向量为值迭代得到的各自变量的次是第的值,次迭代得到的各自变量是第牛顿迭代序列依二元方程组,可得到的值。

matlab高斯牛顿算法求参数

matlab高斯牛顿算法求参数

matlab高斯牛顿算法求参数
一、背景
1、matlab高斯牛顿算法是一种解决非线性回归问题的算法,它是一类最优化算法的一种,主要用于迭代求解多个参数之间的关系。

2、matlab高斯牛顿算法的核心思想就是以“最小二乘法”为基础,基于牛顿迭代法,对模型参数不断迭代,最终获取最优参数,从而达到最小化平方误差。

二、实现原理
1、matlab高斯牛顿算法是利用牛顿迭代法求解参数。

牛顿法的迭代过程中,采用“梯度下降法”的概念,逐步减少误差,最终趋近最优解。

2、在迭代过程中,需要求解参数的梯度,此时使用偏导数表来求解。

对于非线性模型,误差即为拟合曲线到样本点距离的平方和,即所谓的二次损失函数,求解参数的梯度,即求此损失函数的偏导数。

3、求解参数的梯度以后,就可以进行参数的迭代更新,根据迭代的结果,可以求出该参数的最优解,即最小二乘法所说的唯一最优参数,此时迭代求解就可以结束。

三、使用步骤
1、首先,使用matlab实现梯度下降法,求出参数的梯度和初值。

2、根据参数的梯度和初值,构建误差函数,求偏导数,以计算梯度方向,然后运用牛顿迭代法,对参数进行更新。

3、使用给定的步长和迭代次数,开始做参数迭代更新,不断的
改变参数的值,寻求最优参数。

4、迭代停止后,获取参数最优值,结束matlab高斯牛顿算法迭代过程。

四、结论
matlab高斯牛顿算法是一种求解非线性回归问题的最优化算法。

其核心思想是根据损失函数的梯度,通过牛顿迭代法,不断更新参数,最终求解出最优参数,从而最小化平方误差。

非线性方程数值解法的探讨与MATLAB实现

非线性方程数值解法的探讨与MATLAB实现

非线性方程数值解法的探讨与MATLAB实现摘要非线性方程在实际问题中经常出现,如科学与工程计算,因此研究和探讨非线性方程求解的方法具有重要的实际意义.本文首先介绍了非线性方程的概念及相关背景;其次描述了非线性方程常用的一些数值方法:二分法,牛顿迭代法,割线法;然后针对各种方法编写MATLAB程序,并对非线性方程的实例进行数值计算,比较各种算法的优劣;最后介绍了割线法在实际生活中的应用.关键词:非线性方程,二分法,牛顿迭代法,割线法Discussion and MATLAB Realization of Nonlinear Numerical SolutionAuthor: Feng WenghaoTutor: Zhang RongyanAbstractIn practical problems, nonlinear equations often appear, such as scientific and engineering computing. Therefore, to study and explore methods of nonlinear equations has important practical significance.In this paper, we describe the concept and background of nonlinear equations first; second, it describes the commonly used numerical methods of nonlinear equations: Dichotomy, Newton iteration method, Secant method. Then we use MATLAB to write computer program aimed at these methods,do numerical calculations in some practical problems of nonlinear equations and make comparison of various methods. Finally,the application of secant method in real life.Keywords: Nonlinear equation, Dichotomy, Newton iteration method, Secant method(空一行、小五号、1倍行距)目录(空一行、三号、1.5倍行距)1 绪论 (1)1.1 数值方法背景简介 (1)1.2 非线性方程简介 (2)1.2.1 非线性方程的背景 (2)1.2.2 非线性方程的研究内容 (2)1.2.3 根的存在性定理 (3)2 非线性方程的数值解法 (4)2.1 引言 (4)2.2 二分法 (4)2.2.1 二分法简介 (4)2.2.2 二分法的原理 (4)2.3 牛顿迭代法 .............................................................................. 错误!未定义书签。

牛顿迭代法在求解非线性方程重根问题中的研究

牛顿迭代法在求解非线性方程重根问题中的研究

牛顿迭代法在求解非线性方程重根问题中的研究摘要:牛顿迭代法是求解非线性方程的根的常用方法。

在实际计算中往往会遇到重根情况,针对这种情况,我们在牛顿迭代法的理论基础上,探讨了三种不同的迭代格式。

为了对比这三种方法,本文进行了两个实验,分别是含有重根的非线性方程求解问题实例和牛顿迭代法在求解购房按揭利率的应用实例。

在分析运算结果后,得出了三种算法优势和劣势。

关键词:牛顿迭代法;MA TLAB;重根Abstract:Newton iteration method is a common method to solve the roots of nonlinear equations. In order to solve this problem, we discuss three different iteration schemes based on Newton iteration method. In order to compare the three methods, two experiments are carried out in this paper, one is the solving of nonlinear equations with heavy roots, and the other is the application of Newton iteration method in solving house mortgage interest rate. The advantages and disadvantages of three algorithms are obtained after analyzing the results.Key words:Newton iterative method;MA TLAB;Root weight目录摘要 (Ⅰ)Abstract (Ⅰ)目录 (Ⅱ)1 相关概念 (1)1.1 非线性方程 (1)1.2 重根问题 (1)1.3 不动点和不动点迭代法 (1)1.4 迭代法的收敛性 (2)2 牛顿迭代法 (2)2.1 牛顿迭代算法 (2)2.2 重根情形 (3)3 牛顿迭代法的数值实验 (5)3.1 实验一 (5)3.2 实验二 (7)4 结论 (8)参考文献: (9)附录 (10)附录A 算法1 (10)附录B 算法2 (10)附录C 算法3 (11)附录D 实验一程序 (11)附录E 算法1 (12)附录F 算法2 (12)附录G 算法3 (13)附录H 实验二程序 (13)1 相关概念1.1 非线性方程在科学和工程计算中存在大量的方程()0f x =求根的问题,比如代数方程10110n n n n a x a x a x a --++++=,其中00a ≠,当1,2n =时其解是熟知的,当3,4n =时解的公式可以在数学手册上查到,但是当5n ≥时,方程的跟是不能用四则运算和根式运算的公式表示出来的。

matlab牛顿迭代法算重根

matlab牛顿迭代法算重根

一、简介Matlab是一种十分常用的科学计算软件,其功能强大,可以进行各种数值计算、数据分析和可视化操作。

而牛顿迭代法是一种用于求解方程的数值算法,可以有效地计算出函数的根。

本文将重点介绍如何使用Matlab进行牛顿迭代法来计算重根。

二、牛顿迭代法原理1. 牛顿迭代法是一种迭代逼近的方法,通过不断迭代得到更接近函数零点的近似值。

其公式如下:X_{n+1} = X_n - \frac{f(X_n)}{f'(X_n)}其中,X_{n+1}为下一次迭代的近似值,X_n为当前的近似值,f(X)为函数值,f'(X)为函数的导数值。

2. 牛顿迭代法的优点是收敛速度快,而缺点是对初始值的选择敏感,可能会产生不收敛的情况。

三、在Matlab中使用牛顿迭代法1. 在Matlab中,可以使用内置的函数`fzero`来进行牛顿迭代法的计算。

其语法如下:x = fzero(fun,x0)其中,fun为要求解的函数句柄,x0为起始点的初始值,x为函数的根。

2. 需要注意的是,在使用`fzero`函数时,需要提供函数的句柄,即在Matlab中定义要求解的函数,并使用`(x)`符号来表示函数的自变量。

另外,还需要提供初始值x0,可以根据具体问题来选择较为合适的初始值。

3. 以下是一个简单的使用牛顿迭代法求解函数根的示例代码:```matlabf = (x) x^3 - 2*x - 5;x0 = 2;x = fzero(f, x0);disp(x);```四、示例接下来,我们将通过一个具体的示例来演示如何使用Matlab的牛顿迭代法来计算重根。

1. 问题描述假设有如下方程:f(x) = x^3 - 2x^2 + 3x - 6我们希望使用牛顿迭代法来计算函数f(x)的重根。

2. 解决过程在Matlab中定义函数f(x):```matlabf = (x) x^3 - 2*x^2 + 3*x - 6;```选择初始值x0,并利用`fzero`函数进行牛顿迭代法的计算:```matlabx0 = 2;x = fzero(f, x0);disp(x);```3. 结果分析经过计算,可以得到函数f(x)的一个重根为x=2.这样,我们就成功地使用Matlab的牛顿迭代法来计算重根。

matlab求解非线性方程组

matlab求解非线性方程组

非线性方程组求解1.mulStablePoint用不动点迭代法求非线性方程组的一个根function [r,n]=mulStablePoint(F,x0,eps)%非线性方程组:f%初始解:a%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0); %迭代公式tol=norm(r-x0); %注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend2.mulNewton用牛顿法法求非线性方程组的一个根function [r,n]=mulNewton(F,x0,eps)if nargin==2eps=1.0e-4;endx0 = transpose(x0);Fx = subs(F,findsym(F),x0);var = findsym(F);dF = Jacobian(F,var);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx;n=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx; %核心迭代公式tol=norm(r-x0);n=n+1;if(n>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend3.mulDiscNewton用离散牛顿法法求非线性方程组的一个根function [r,m]=mulDiscNewton(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=transpose(x0)-inv(J)*fx;m=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;4.mulMix用牛顿-雅可比迭代法求非线性方程组的一个根function [r,m]=mulMix(F,x0,h,l,eps)if nargin==4eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = transpose(x0)-dr; m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend5.mulNewtonSOR用牛顿-SOR迭代法求非线性方程组的一个根function [r,m]=mulNewtonSOR(F,x0,w,h,l,eps)if nargin==5eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = transpose(x0)-dr;m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend6.mulDNewton用牛顿下山法求非线性方程组的一个根function [r,m]=mulDNewton(F,x0,eps)%非线性方程组:F%初始解:x0%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-4;endx0 = transpose(x0);dF = Jacobian(F);m=1;tol=1;while tol>epsttol=1;w=1;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);F1=norm(Fx);while ttol>=0 %下面的循环是选取下山因子w的过程r=x0-w*inv(dFx)*Fx; %核心的迭代公式Fr = subs(F,findsym(F),r);ttol=norm(Fr)-F1;w=w/2;endtol=norm(r-x0);m=m+1;x0=r;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend7.mulGXF1用两点割线法的第一种形式求非线性方程组的一个根function [r,m]=mulGXF1(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(x1);n = length(x0);fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = x1;x1 = r;fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;8.mulGXF2用两点割线法的第二种形式求非线性方程组的一个根function [r,m]=mulGXF2(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(x1);n = length(x0);fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);xt = x1;xt(1) = x0(1);J(:,1) = (subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1);for i=2:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = x1;x1 = r;fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);xt = x1;xt(1) = x0(1);J(:,1) = (subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1);for i=2:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;9.mulVNewton用拟牛顿法求非线性方程组的一组解function [r,m]=mulVNewton(F,x0,A,eps)%方程组:F%方程组的初始解:x0% 初始A矩阵:A%解的精度:eps%求得的一组解:r%迭代步数:mif nargin==2A=eye(length(x0)); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendx0 = transpose(x0);Fx = subs(F, findsym(F),x0);r=x0-A\Fx;m=1;tol=1;while tol>epsx0=r;Fx = subs(F, findsym(F),x0);r=x0-A\Fx;y=r-x0;Fr = subs(F, findsym(F),r);z= Fr-Fx;A1=A+(z-A*y)*transpose(y)/norm(y); %调整A A=A1;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end10.mulRank1用对称秩1算法求非线性方程组的一个根function [r,n]=mulRank1(F,x0,A,eps)if nargin==2l = length(x0);A=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-inv(A)*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-inv(A)*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;A1=A+ fr *transpose(fr)/(transpose(fr)*y); %调整A A=A1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end11.mulDFP用D-F-P算法求非线性方程组的一组解function [r,n]=mulDFP(F,x0,A,eps)if nargin==2l = length(x0);B=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整AB=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end12.mulBFS用B-F-S算法求非线性方程组的一个根function [r,n]=mulBFS(F,x0,B,eps)if nargin==2l = length(x0);B=eye(l); %B取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;u = 1 + z'*B*z/(y'*z);B1= B+ (u*y*y'-B*z*y'-y*z'*B)/(y'*z); %调整B B=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end13.mulNumYT用数值延拓法求非线性方程组的一组解function [r,m]=mulNumYT(F,x0,h,N,eps)format long;if nargin==4eps=1.0e-8;endn = length(x0);fx0 = subs(F,findsym(F),x0);x0 = transpose(x0);J = zeros(n,n);for k=0:N-1fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endinJ = inv(J);r=x0-inJ*(fx-(1-k/N)*fx0);x0 = r;endm=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;14.DiffParam1用参数微分法中的欧拉法求非线性方程组的一组解function r=DiffParam1(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);for k=1:NFx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endinJ = inv(J);r = x0 - ht*inJ*Fx0;x0 = r;end15.DiffParam2用参数微分法中的中点积分法求非线性方程组的一组解function r=DiffParam2(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nxt = x0;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx0)/h(i);endinJ = inv(J);x1 = x0 - ht*inJ*Fx0;for k=1:Nx2 = x1 + (x1-x0)/2;Fx2 = subs(F,findsym(F),x2);J = zeros(n,n);for i=1:nxt = x2;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx2)/h(i);endinJ = inv(J);r = x1 - ht*inJ*Fx0;x0 = x1;x1 = r;end16.mulFastDown用最速下降法求非线性方程组的一组解function [r,m]=mulFastDown(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0-J*lamda; %核心迭代公式fr = subs(F,findsym(F),r);tol=dot(fr,fr);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;17.mulGSND用高斯牛顿法求非线性方程组的一组解function [r,m]=mulGSND(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endDF = inv(transpose(J)*J)*transpose(J);r=x0-DF*fx; %核心迭代公式tol=norm(r-x0);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;18.mulConj用共轭梯度法求非线性方程组的一组解function [r,m]=mulConj(F,x0,h,eps)format long;if nargin==3eps=1.0e-6;endn = length(x0);x0 = transpose(x0);fx0 = subs(F,findsym(F),x0);p0 = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)*(1+h);p0(:,i) = -(subs(F,findsym(F),x1)-fx0)/h;endm=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0+p0*lamda; %核心迭代公式fr = subs(F,findsym(F),r);Jnext = zeros(n,n);for i=1:nx1 = r;x1(i) = x1(i)+h;Jnext(:,i) = (subs(F,findsym(F),x1)-fr)/h;endabs1 = transpose(Jnext)*Jnext;abs2 = transpose(J)*J;v = abs1/abs2;if (abs(det(v)) < 1)p1 = -Jnext+p0*v;elsep1 = -Jnext;endtol=norm(r-x0);p0 = p1;x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;19.mulDamp用阻尼最小二乘法求非线性方程组的一组解function [r,m]=mulDamp(F,x0,h,u,v,eps)format long;if nargin==5eps=1.0e-6;endFI = transpose(F)*F/2;n = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsj = 0;fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;afx = subs(F,findsym(F),x1);J(:,i) = (afx-fx)/h;endFIx = subs(FI,findsym(FI),x0);for i=1:nx2 = x0;x2(i) = x2(i)+h;gradFI(i,1) = (subs(FI,findsym(FI),x2)-FIx)/h;ends=0;while s==0A = transpose(J)*J+u*eye(n,n);p = -A\gradFI;r = x0 + p;FIr = subs(FI,findsym(FI),r);if FIr<FIxif j == 0u = u/v;j = 1;elses=1;endelseu = u*v;j = 1;if norm(r-x0)<epss=1;endendendx0 = r;tol = norm(p);m=m+1;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendformat short;。

非线性方程组求解及matlab实现讲解

非线性方程组求解及matlab实现讲解

牛顿迭代法收敛速度快,但它要求计算函数导数的值
弦截法


牛顿迭代法收敛速度快,但它要求计算函数导数的值。 在科学与工程计算中,常会碰到函数导数不易计算或 者算式复杂而不便计算的情况 弦截法的基本思想与牛顿法相似,即将非线性函数线 性化后求解。两者的差别在于弦截法实现函数线性化 的手段采用的是两点间的弦线(用差商代替导数), 而不是某点的切线
f xk xk 1 xk xk xk 1 f xk f xk 1
弦截法示意图
弦截法注意事项


与牛顿法只需给出一个初值不同,弦截法需要给出两 个迭代初值。如果与逐步扫描法结合起来,则最后搜 索的区间的两个端点值常可作为初值 弦截法虽比牛顿法收敛速度稍慢,但在每次迭代中只 需计算一次函数值,又不必求函数的导数,且对初值 要求不甚苛刻,是工程计算中常用的有效计算方法之 一



不动点迭代 牛顿法 弦截法 抛物线法 威格斯坦法(Wegstein)
不动点迭代法
我们可以通过多种方法将方程式
f x 0
例如方程
转化为
x g x
c0
x c 0,
2
可以转化为以下不同形式
2 x x xc (1)
(2)
x
x2 c 1 c x (3) x x 2x 2 x
松弛迭代法

有些非线性方程用前面的不动点迭代法求解时, 迭代过程是发散的。这时可以引入松弛因子, 利用松弛迭代法。通过选择合适的松弛因子, 就可以使迭代过程收敛
xn1 xn xn xn
迭代法是计算数学的一种重要方法,用途很广,求解 线性方程组和矩阵特征值时也要用到这种方法

matlab迭代法解方程的程序

matlab迭代法解方程的程序

文章标题:使用MATLAB迭代法解方程的程序目录1. 什么是迭代法解方程2. MATLAB中迭代法的实现3. 迭代法解方程的优缺点4. 实例分析:使用MATLAB实现迭代法解方程5. 结语1. 什么是迭代法解方程迭代法是一种数值计算方法,用于逼近方程的根或解。

在实际应用中,经常会遇到无法通过代数方法得到准确解的方程,这时候就需要借助数值计算的方法来求得近似解。

迭代法通过不断逼近解的过程,逐步缩小误差,最终得到一个接近精确解的近似值。

2. MATLAB中迭代法的实现MATLAB作为一种强大的数值计算工具,提供了丰富的数值计算函数和工具箱,其中包括了多种迭代法的实现。

在MATLAB中,常用的迭代法有牛顿法、雅各比迭代法、高斯-赛德尔迭代法等。

这些迭代法都可以通过调用MATLAB内置函数或自行编写程序实现。

在编写迭代法程序时,需要注意选择合适的迭代停止条件、初始化的迭代值、迭代步数等参数。

3. 迭代法解方程的优缺点迭代法解方程具有以下优点:1) 适用范围广:迭代法可以解决各种类型的方程,包括线性方程组、非线性方程、微分方程等;2) 可以得到近似解:即使方程无法通过代数方法求解,迭代法也可以得到一个接近精确解的近似值;3) 数值稳定性:在一定条件下,迭代法能够保证解的稳定性和收敛性。

但迭代法也存在一些缺点:1) 收敛速度慢:一些迭代法可能需要较多的迭代次数才能得到满意的解;2) 初始值敏感:迭代法对初始值的选取比较敏感,选取不当可能导致迭代发散或者收敛到错误的解;3) 复杂度高:一些迭代法的实现比较复杂,需要具备较高的数值计算和编程能力。

4. 实例分析:使用MATLAB实现迭代法解方程接下来,我们将以求解非线性方程x^2-3x+2=0为例,使用MATLAB实现迭代法来求得方程的根。

我们选择使用简单而经典的二分法来进行迭代计算。

```MATLABfunction result = iteration_method()f = @(x) x^2 - 3*x + 2;a = 0;b = 2;tol = 1e-6;if f(a)*f(b) > 0error('The function has the same sign at the endpoints.'); endwhile (b - a) > tolc = (a + b) / 2;if f(c) == 0break;elseif f(a)*f(c) < 0b = c;elsea = c;endresult = c;endend```上述代码中,我们通过定义函数f(x)为方程的表达式,并选择区间[a, b]为[0, 2]作为初始迭代区间。

matlab中实现高斯牛顿迭代法拟合曲线

matlab中实现高斯牛顿迭代法拟合曲线

高斯-牛顿迭代法是一种用于拟合非线性模型的迭代算法。

以下是一个在MATLAB中实现高斯-牛顿迭代法的基本示例。

在这个示例中,我们将尝试拟合一个简单的高斯函数。

假设我们的模型是:f(x) = a * exp(-(x-b)^2 / (2 * c^2))我们的目标是找到参数a,b和c,使得数据与模型之间的平方误差最小。

首先,我们需要定义一些基本函数。

例如,我们需要计算模型的值、模型的导数和平方误差。

matlab复制代码function GaussNewtonclose all;clear all;clc;% 数据x = linspace(-10,10,100)';y = 3*exp(-(x-2).^2/2) + 0.01*randn(size(x));% 初始参数a = 1;b = 1;c = 1;% 参数向量theta = [a b c];% 模型值f = a .* exp(-(x - b).^2 / (2 * c.^2));% 模型的导数df = [exp(-(x - b).^2 / (2 * c.^2)) - (x - b).^2 .* a .* exp(-(x -b).^2 / (2 * c.^2)) / (2 * c.^2); 0; -2 * a .* exp(-(x - b).^2 / (2* c.^2)) * (x - b) / (c.^3)];% 平方误差g = y - f;J = g'*g;% Gauss-Newton迭代Delta_theta = zeros(size(theta));I = eye(size(theta));H = zeros(size(theta));r = g;Delta_theta(1) = inv(I - H(1)) * r;Delta_theta(end) = Delta_theta(end) + H(end) *Delta_theta(1:end-1);Delta_theta = Delta_theta + H * Delta_theta;Delta_theta = Delta_theta + inv(H + I*1e-6) * r;Delta_theta = Delta_theta - inv(H + I*1e-6); % unbiase the iteration incrementtheta = theta + Delta_theta;这个代码的主要部分是高斯-牛顿迭代部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先画出函数图像找出大概位置
ezplot('exp(x^(-2)+y^(-2))=4',[-6,6,-6,6])%画出函数g
y=2.4:0.001:3.8;
x=(tan(1)+4-y.^(3/2)).^3;
hold on
plot(x,y)%画出函数f
将图放大观察
由图可以看出两个交点的大概位置是(-1,3.4)和(1,2.6)。
1. 二元函数的newton迭代法理论分析
设 在点 的某一邻域内连续且有直到2阶的连续偏导数, 为该邻域内任意一点,则有
其中 ,
于是方程 可近似表示为

同理,设 在点 的某一邻域内连续且有直到2阶的连续偏导数, 为该邻域内任意一点,亦有
其中 ,
于是方程 可近似表示为

于是得到方程组
求解这个方程组,当
所以将这两个点作为初始值进行迭代计算,MATLAB编程如下:
form=1:2;%循环两次计算出两个解
ifm<2
x=1;
y=2.6;
else
x=-1;
y=3.4;
end
xk=0;
yk=0;
i=0;
t=1;
whilet>0.000001%设置计算精度
i=i+1;
f=(tan(1)+4-y^(3/2))^3-x;

从而
(1)
记符号
于是(1)式可改写为
(2)迭代公式为:(3)通过迭代公式(3)可以迭代出当 时, 的值,当 ( 为给定的误差控制项)时,原方程组的根即为 。
2.newton迭代法求解给定的线性方程组
方程组
其中
求解过程如下
于是迭代公式为
为了解出正负轴的两个解,需要对函数f进行变形。
3.MATLAB编程实现过程
g=exp(x^(-2)+y^(-2))-4;
fx=-1;
fy=3*(tan(1)+4-y^(3/2))^2*(-1.5*y^(1/2));
gx=-2*x^(-3)*exp(x^(-2)+y^(-2));
gy=-2*y^(-3)*exp(x^(-2)+y^(-2));
xk=x+(f*gy-g*fy)/(gx*fy-fx*gy);
yk=y+(g*fx-f*gx)/(gx*fy-fx*gy);
t=abs(xk-x);
x=xk;
y=yk;
end
sprintf('i=%d\nx=%8.8f\ny=%8.8f',i,x,y)%输出计算次数及计算结果
end
计算结果如下图所示
计算精度为0.000001,迭代5次计算出结果
相关文档
最新文档