matlab实验一:非线性方程求解-牛顿法

合集下载

非线性方程求根—牛顿迭代法(新)

非线性方程求根—牛顿迭代法(新)

非线性方程求根——牛顿迭代法一、牛顿迭代法的基本思想基本思想:将非线性方程逐步归结为某种线性方程求解。

设方程f (x )=0有近似根x k (f `(x k )≠0),将f (x )在x k 展开:(ξ在x 和x k 之间)2()()()()()()2!k k k k f f x f x f x x x x x ξ'''=+-+-()()()()k k k f x f x f x x x '≈+-可设记该线性方程的根为x k +1,则()()()0k k k f x f x x x '+-=1()()k k k k f x x x f x +=-'故f (x )=0可近似表示为即为Newton 法迭代格式。

(k =0,1,……)例:用Newton 迭代法求方程310x x --=在x 0=1.5附近的近似实根。

解:32()1,()31f x x x f x x '=--=-迭代公式为312131kk k k k x x x x x +--=--计算步骤如下:(1)取初值x 0=1.5;(2)按照迭代公式计算x 1;(3)若|x 1-x 0|<=0.00001,终止迭代;否则,x 0=x 1;转(2);(4)输出迭代次数和近似根.二、牛顿迭代法的实现MATLAB求解程序设计:方程及一阶导数函数:function[fun,dfun]=fun0(x)fun=x^3-x-1;%求原函数的值dfun=3*x^2-1;%求一阶导数的值计算主程序:clearx0=1.5;[fun,dfun]=fun0(x0);x1=x0-fun/dfun;i=1;while abs(x1-x0)>1e-5x0=x1;[fun,dfun]=fun0(x0);x1=x0-fun/dfun;i=i+1;enddisp('the solution is x1=')x1disp('the iter time is ')i计算结果为:the solution is x1=x1 =1.3247the iter time isi =4可见经过4次迭代即到达要求的精度,原方程的一个近似实数根为1.3247.三、牛顿迭代法的收敛性牛顿迭代法的迭代函数:)()()(x f x f x x '-=ϕ222)]([)()()]([)()()]([1)(x f x f x f x f x f x f x f x '''='''-'-='ϕ设f (x *)=0,f `(x *)≠0,则ϕ`(x *)=0,故Newton 迭代法在x *附近至少平方收敛。

matlab牛顿拉夫逊法与快速分解法的实现

matlab牛顿拉夫逊法与快速分解法的实现

一、概述MATLAB是一种强大的数学软件工具,它提供了许多优秀的数值计算和数据分析功能。

其中,牛顿拉夫逊法和快速分解法是两种常用的数值计算方法,它们在解决非线性方程组和矩阵分解等问题中具有重要的应用价值。

本文将介绍如何在MATLAB中实现这两种方法,并对它们的优缺点进行详细分析。

二、牛顿拉夫逊法的实现1. 算法原理牛顿拉夫逊法是一种用于求解非线性方程组的迭代算法。

它利用函数的一阶和二阶导数信息来不断逼近方程组的解,直到满足精度要求为止。

算法原理可以用以下公式表示:公式1其中,x表示解向量,F(x)表示方程组的函数向量,J(x)表示方程组的雅可比矩阵,δx表示解的更新量。

通过不断迭代更新x,最终得到方程组的解。

2. MATLAB代码实现在MATLAB中,可以通过编写函数来实现牛顿拉夫逊法。

以下是一个简单的示例代码:在这段代码中,首先定义了方程组的函数向量和雅可比矩阵,然后利用牛顿拉夫逊法进行迭代更新,直到满足精度要求为止。

通过这种方式,就可以在MATLAB中实现牛顿拉夫逊法,并应用于各种实际问题。

三、快速分解法的实现1. 算法原理快速分解法是一种用于矩阵分解的高效算法。

它利用矩阵的特定性质,通过分解为更小的子问题来加速计算过程。

算法原理可以用以下公式表示:公式2其中,A表示要分解的矩阵,L和U分别表示矩阵的下三角和上三角分解。

通过这种分解方式,可以将原始矩阵的计算量大大减小,提高求解效率。

2. MATLAB代码实现在MATLAB中,可以利用内置函数来实现快速分解法。

以下是一个简单的示例代码:在这段代码中,利用MATLAB内置的lu函数进行LU分解,得到矩阵的下三角和上三角分解。

通过这种方式,就可以在MATLAB中实现快速分解法,并应用于各种矩阵计算问题。

四、方法比较与分析1. 算法复杂度牛顿拉夫逊法和快速分解法在计算复杂度上有所不同。

牛顿拉夫逊法的迭代次数取决于所求解问题的非线性程度,通常需要较多的迭代次数。

牛顿迭代法解非线性方程组(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 实现牛顿迭代法求解非线性方程组已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0x1A2-81*(x2+A2+si n(x3)+=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到首先建立函数fun 储存方程组编程如下将保存到工作路径中function f=fun(x);%定义非线性方程组如下%变量x1 x2 x3%函数f1 f2 f3syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2;f2=x1A2-81*(x2+A2+sin(x3)+; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;f=[f1 f2 f3];建立函数dfun 用来求方程组的雅克比矩阵将保存到工作路径中function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun 中f=fun(x);df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];df=conj(df');编程牛顿法求解非线性方程组将保存到工作路径中function x=newton(x0,eps,N);con=0;eps 为精度要求 N 为最大迭代步数 con 用来记录结果是否收敛 for i=1:N;x=x0-f/df;for j=1: length(x0);il(i,j)=x(j);end if norm(x-x0)<eps con=1;break;end x0=x;endfid=fopen('','w');fprintf(fid,'iteration');for j=1:length(x0)endfor j=1:ifor k=1:length(x0) %其中 x0 为迭代初值 f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1)x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1)x0(2) x0(3)}); %以下是将迭代过程写入 txt 文档文件名为fprintf(fid,' x%d',j);fprintf(fid,'\n%6d ',j);fprintf(fid,' %',il(j,k));end endif con==1fprin tf(fid,'\n 计算结果收敛!');endif con==0fprin tf(fid,'\n 迭代步数过多可能不收敛!');endfclose(fid);运行程序在matlab中输入以下内容newt on([ ],,20)输出结果»nawtnnC[0. 1 0. 1 -0, 11,0.00001,20)ans =0. 5000 0. OOCO -0. 523S在iteration 中查看迭代过程iteration x1 x2 x31 2j.1:erat ion xl X30. 031238-0.51960110.490718320. 5090110. 003498-0.521634 430. 5009 2&0. 000756-0.523391 540. 5002E70. 000076-0.52355065)5000190+ 000013-0. 5235947S0. 50LI005 D. 000002-0.S235983r CL 5000000+OOOCOO-0. 5235999 计尊结果收敘!.mulStablePoint 用不动点迭代法求非线性方程组的一个根function [r,n]=mulStablePoint(F,x0,eps)%非线性方程组:f%初始解:a%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=;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;endendxO=[O 0 0];[r,n, data]=budo ng(xO);disp('不动点计算结果为')x仁[1 1 1];x2=[2 2 2];[x, n,data]=n ew_ton (x0);disp('初始值为0,牛顿法计算结果为:’)[x, n,data]=n ew_ton (x1);disp('初始值为1,牛顿法计算结果为:')[x, n,data]=n ew_ton (x2);disp ('初始值为2,牛顿法计算结果为:')function[r,n, data]=bud on g(x0, tol) if nargin=-1tol=1e-3 :endx1=budo ng fun( x0) ;n=1;while( norm(x1-x0))tol)&(n500)xO=x1;x1=budo ng_fun( x0);n=n+1:data(:, n)=x1 ;endr=x1 :function [x,n,data]=new_ton(x0, tol)if nargin=-1tol=1e-8 ;endx1=x0-budo ng_fun (x0)/df1(x0);n=1;while (n orm(x1-x0))tol)x0=x1;x1=x0-budo ng_fun (x0)/df1(x0);n=n+1;data(:, n)=x1;endx=x1;function f=bud ong_fun(x)f(1)=3* x(1)-cos(x(2)*x (3))-1/2;f(2)=x(1)A2-81*(x(2)+A2+si n(x(3))+; f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1; f=[f(1)*f(2)*f(3)] ;fun ctio n f=df1(x)f=[3s in (x(2)*x(3))*x(3) si n(x(2)*x(3))*x(2)2* x(1)-162*(x(2)+cos(x(3))exp(-x(1)*x(2))*(-x (2))exp(-x(1)*x(2))*(-x(1))20]; 结果:不动点计算结果为r=+012*NaN -Inf初始值为0,牛顿法计算结果为:x=初始值为1,牛顿法计算结果为:x=初始值为2,牛顿法计算结杲为:x=。

牛顿法解非线性方程(MATLAB和C++)

牛顿法解非线性方程(MATLAB和C++)

41 end
42 time = toc;
43
44 fprintf('\nIterated times is %g.\n', times);
45 fprintf('Elapsed time is %g seconds.\n', time);
46
47 root = x_iter;
48
49 % subfunction
5
6 // 功能描述:求解非线性方程根,并输出最终解 7 // 迭代式:x(k+1) = x(k) - f(x(k))/df(x(k)). 8 // 使用:修改标出的“修改”部分即可自定义参数
9
10 // 输入:函数 fun,函数导数 dfun,初值 x0,
4
11 // 最大迭代次数 maxiter,停止精度 tol 12 // 输出:迭代数值解 x_iter2
2
Listing 1: MATLAB EXAMPLE 1 % 2013/11/20 15:14:38
2
3 f = @(x)x^2 − 2; 4 df = @(x)2*x; 5 x0 = 3; 6 root = newton(f, df, x0);
C++ 以 C++ 实现的方法并未编写成为一般可调用的方法,而作为一个独立的 文件(包含一个实例),修改部分即可求解对应的方程。具体参照 cpp 文件内 注释。
A 附录
A.1 MATLAB
Listing 2: MATLAB CODE 1 function root = newton(f, df, x0, maxiter, tol) 2 %NEWTON Newton's method for nonlinear equations. 3% 4 % NEWTON's method: x(k+1) = x(k) - f(x(k))/f'(x(k)). 5% 6 % Inputs 7 % f - nonlinear equation. 8 % df - derivative of f(x). 9 % x0 - initial value. 10 % maxiter - maximum iterated times. 11 % tol - precision. 12 % 13 % Outputs 14 % root - root of f(x) = 0.

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
迭代法是计算数学的一种重要方法,用途很广,求解 线性方程组和矩阵特征值时也要用到这种方法

牛顿法解非线性方程组实验报告

牛顿法解非线性方程组实验报告

由f i ( x) 偏导数作成的矩阵记为 J(x)或 F ' ( x) 称为 F(x)的 Jacobi 矩阵
设 x* 为 F(x)=0 的解,且设 x( k )
数f i ( x) 在 x( k ) 点的泰勒公式有
f i ( x)
1 2

j
J( x ) F ' ( x ) x1 x2
(2) 求解一个线性方程组: J( x( k ) )x( k ) F( x( k ) )
(3) 计算 x( k 1) x( k ) x( k ) 。 2、流程图见附图 1
4 程序代码及注释
%牛顿法解非线性方程组 function [Z,P,k,e] = newton(P,e0) %用P输入初始猜想矩阵,不断迭代输出计算解 %Z为迭代结束后的F矩阵 %k为迭代次数,e为每次迭代后的无穷范数,e0为误差限 Z=F(P(1),P(2)); J=JF(P(1),P(2)); Q=P-J\Z; e=norm((Q-P),inf); P=Q; Z=F(P(1),P(2)); k=1; while e>=e0
00要求10算法原理与流程图1算法原理设有非线性方程组称为fx的jacobi矩阵的第k1次近似解记为求解非线性方程组fx0牛顿法或为程序代码及注释牛顿法解非线性方程组functionnewtonpe0用p输入初始猜想矩阵不断迭代输出计算解z为迭代结束后的f矩阵k为迭代次数e为每次迭代后的无穷范数e0为误差限qpjz
xi gi ( x1, x2, , xn ) ,(i 1, 2, n)
或者简记为 x=g(x),其中 gi : Rn R, g : Rn Rn
g( x)


g1(
g2(

利用牛顿迭代法求解非线性方程组

利用牛顿迭代法求解非线性方程组

利⽤⽜顿迭代法求解⾮线性⽅程组最近⼀个哥们,是⽤⽜顿迭代法求解⼀个四变量⽅程组的最优解问题,从⽹上找了代码去改进,但是总会有点不如意的地⽅,迭代的次数过多,但是却没有提⾼精度,真是令⼈揪⼼!经分析,发现是这个⽅程组中存在很多局部的极值点,是⽤⽜顿迭代法不能不免进⼊局部极值的问题,更程序的初始值有关!发现⾃⼰好久没有是⽤Matlab了,顺便从⽹上查了查代码,⾃⼰来修改⼀下!先普及⼀下⽜顿迭代法:(来⾃百度百科)⽜顿(Newton's method)⼜称为⽜顿-拉夫逊(拉弗森)⽅法(Newton-Raphson method),它是在17世纪提出的⼀种在域和域上近似求解⽅程的⽅法。

多数⽅程不存在求根公式,因此求精确根⾮常困难,甚⾄不可能,从⽽寻找⽅程的近似根就显得特别重要。

⽅法使⽤函数f(x)的的前⾯⼏项来寻找⽅程f(x) = 0的根。

⽜顿迭代法是求⽅程根的重要⽅法之⼀,其最⼤优点是在⽅程f(x) = 0的单根附近具有平⽅收敛,⽽且该法还可以⽤来求⽅程的重根、复根,此时线性收敛,但是可通过⼀些⽅法变成超线性收敛。

另外该⽅法⼴泛⽤于计算机编程中。

设r是f(x)=0的根。

选取x0作为r的初始近似值,过点(x0,f(x0))做曲线的切线,求出该切线与x轴的交点,并求出该点的横坐标,称作x1是r 的⼀次近似。

如此就可以推导出⽜顿迭代公式。

已经证明,如果是的,并且待求的零点是孤⽴的,那么在零点周围存在⼀个区域,只要初始值位于这个邻近区域内,那么⽜顿法必定收敛。

并且,如果不为0, 那么⽜顿法将具有平⽅收敛的性能. 粗略的说,这意味着每迭代⼀次,⽜顿法结果的有效数字将增加⼀倍。

在⽹上查了⼀些代码,都是能指定某⼏个函数进⾏求导的,⽽且要是改变函数的个数,却⼜要对原始程序⼤动⼲⼽。

真的是揪⼼。

找到了这个程序,貌似在Matlab上不能很好的运⾏,对于数据的返回值为空没有做处理,后来⼜找了⼀个⽹易朋友的博客,将他的代码拿过来跑跑,还可以,但是对于不同的函数⽅程组,以及变量个数就不同了,真的是揪⼼,这个就是程序设计和编码的问题了!⾃⼰就拿来改了改,可以⽀持多⽅程组和多变量了!下⾯附上我的代码!求⼤家指导![python]1. function [r,n]=mulNewton(x0,funcMat,var,eps)2. % x0为两个变量的起始值,funcMat是两个⽅程,var为两个⽅程的两个变量,eps控制精度3. % ⽜顿迭代法解⼆元⾮线性⽅程组4. if nargin==05. x0 = [0.2,0.6];6. funcMat=[sym('(15*x1+10*x2)-((40-30*x1-10*x2)^2*(15-15*x1))*5e-4')...7. sym('(15*x1+10*x2)-((40-30*x1-10*x2)*(10-10*x2))*4e-2')];8. var=[sym('x1') sym('x2')];9. eps=1.0e-4;10. end11.12. n_Var = size(var,2);%变量的个数13. n_Func = size(funcMat,2);%函数的个数14. n_X = size(x0,2);%变量的个数15.16. if n_X ~= n_Var && n_X ~= n_Func17. fprintf('Expression Error!\n');18. exit(0);19. end20.21. r=x0-myf(x0, funcMat, var)*inv(dmyf(x0, funcMat, var));22. n=0;23. tol=1;24. while tol>=eps25. x0=r;26. r=x0-myf(x0, funcMat, var)*inv(dmyf(x0, funcMat, var));27. tol=norm(r-x0);28. n=n+1;29. if(n>100000)30. disp('迭代步数太多,⽅程可能不收敛');31. return;32. end33. end34. end % end mulNewton[python]1. function f=myf(x,funcMat, varMat)2. % 输⼊参数x为两个数值,func为1*2符号变量矩阵,var为1*2符号变量矩阵中的变量3. % 返回值为1*2矩阵,内容为数值4.5. n_X = size(x,2);%变量的个数6. f_Val = zeros(1,n_X);7. for i=1:n_X8. tmp_Var = cell(1,n_X);9. tmp_X = cell(1,n_X);10. for j=1:n_X11. tmp_Var{j} = varMat(1,j);12. tmp_X{j} = x(1,j);13. end14. f_Val(i) = subs(funcMat(1, i), tmp_Var, tmp_X);15. end16. f=f_Val;17. end % end myf[python]1. function df_val=dmyf(x, funcMat, varMat)2. % 返回值为2*2矩阵,内容为数值3. %df=[df1/x1, df1/x2;4. % df2/x1. df2/x2];5. n_X = size(x,2);%变量的个数6. df =cell(n_X, n_X);7. for i=1:n_X8. for j=1:n_X9. df{i,j} = diff(funcMat(1, i), varMat(1, j));10. end11. end12.13. df_val=zeros(n_X, n_X);14.15. for i=1:n_X16. for j=1:n_X17. tmp_Var = cell(1,n_X);18. tmp_X = cell(1,n_X);19. for k=1:n_X20. tmp_Var{k} = varMat(1,k);21. tmp_X{k} = x(1,k);22. end23. df_val(i,j) = subs(df{i,j}, tmp_Var, tmp_X);24. end25. end26. end % end dmyf。

非线性方程求解实验报告

非线性方程求解实验报告

数学实验报告非线性方程求解一、实验目的1.掌握用 MATLAB 软件求解非线性方程和方程组的基本用法,并对结果作初步分析;2.练习用非线性方程和方程组建立实际问题的模型并进行求解。

二、实验内容题目1【问题描述】(Q1)小张夫妇以按揭方式贷款买了1套价值20万元的房子,首付了5万元,每月还款1000元,15年还清。

问贷款利率是多少?(Q2)某人欲贷款50 万元购房,他咨询了两家银行,第一家银行开出的条件是每月还4500元,15 年还清;第二家银行开出的条件是每年还45000 元,20 年还清。

从利率方面看,哪家银行较优惠(简单假设:年利率=月利率×12)?【分析与解】假设初始贷款金额为x0,贷款利率为p,每月还款金额为x,第i个月还完当月贷款后所欠银行的金额为x i,(i=1,2,3,......,n)。

由题意可知:x1=x0(1+p)−xx2=x0(1+p)2−x(1+p)−xx3=x0(1+p)3−x(1+p)2−x(1+p)−x……x n=x0(1+p)n−x(1+p)n−1−⋯−x(1+p)−x=x0(1+p)n−x (1+p)n−1p=0因而有:x0(1+p)n=x (1+p)n−1p (1)则可以根据上述方程描述的函数关系求解相应的变量。

(Q1)根据公式(1),可以得到以下方程:150p(1+p)180−(1+p)180+1=0设 f(p)=150p(1+p)180−(1+p)180+1,通过计算机程序绘制f(p)的图像以判断解p的大致区间,在Matlab中编程如下:for i = 1:25t = 0.0001*i;p(i) = t;f(i) = 150*t*(1+t).^180-(1+t).^180+1;end;plot(p,f),hold on,grid on;运行以上代码得到如下图像:f(p)~p关系曲线图通过观察上图可知p∈[0.002,0.0022]。

Solution1:对于p∈[0.002,0.0022],采用二分法求解,在Matlab 中编程如下:clear;clc;x0=150000;n=180;x=1000;p0=0.002;p1=0.0022;while (abs(p1-p0)>1e-8)f0=x0*(1+p0).^n+x*(1-(1+p0).^n)/p0;f1=x0*(1+p1).^n+x*(1-(1+p1).^n)/p1;p2=(p0+p1)/2;f2=x0*(1+p2).^n+x*(1-(1+p2).^n)/p2;if (f0*f2>0 && f1*f2<0)p0=p2;elsep1=p2;end;end;p0结果得到p0=0.00208116455078125=0.2081%.所以贷款利率是0.2081%。

matlab牛顿法程序

matlab牛顿法程序

matlab牛顿法程序牛顿法是一种常用的优化算法,主要用于求解非线性方程或最优化问题。

它基于一阶导数和二阶导数的信息,通过不断迭代逼近目标函数的零点或最小值。

在Matlab中,我们可以利用该语言的强大功能和简洁的语法编写牛顿法程序。

牛顿法的核心思想是利用二阶导数逼近目标函数,然后通过迭代来逼近方程的解。

设目标函数为f(x),则牛顿法的迭代公式为:x_{n+1} = x_n - f'(x_n) / f''(x_n)其中,x_n是当前的迭代点,f'(x_n)和f''(x_n)分别是目标函数在x_n处的一阶导数和二阶导数。

为了编写一个通用的牛顿法程序,我们需要先定义目标函数及其导数求解的函数。

以求解方程f(x) = 0为例,我们将定义一个函数newton_method(f, f_prime, x0, tol),其中f是目标函数,f_prime是一阶导数函数,x0是初始点,tol是迭代精度。

首先,我们需要定义目标函数和一阶导数函数:```matlabfunction y = f(x)y = x^2 - 2;endfunction y = f_prime(x)y = 2*x;end```接下来,我们可以定义牛顿法的主函数newton_method:```matlabfunction root = newton_method(f, f_prime, x0, tol)x = x0;while abs(f(x)) > tolx = x - f(x) / f_prime(x);endroot = x;end```在主函数中,我们使用一个while循环不断迭代,直到满足迭代精度tol。

每次迭代,我们更新x的值,逼近方程的解。

现在,我们可以调用newton_method函数来求解具体的方程。

假设我们要求解方程x^2 - 2 = 0,初始点x0取1,迭代精度tol取0.0001。

matpower牛顿法与快速分解法

matpower牛顿法与快速分解法

matpower牛顿法与快速分解法Matpower的牛顿法和快速分解法是两种常用的电力系统潮流计算方法。

本文将分别介绍这两种方法的原理、优缺点以及在Matpower中的应用。

1.牛顿法牛顿法是一种迭代求解非线性方程组的方法,通过不断线性化方程组,利用牛顿迭代来逼近方程的解。

在电力系统潮流计算中,牛顿法通常用于求解节点电压和潮流功率。

原理:牛顿法基于牛顿-拉夫逊迭代公式,通过不断迭代线性化的方程组,利用雅可比矩阵和残差向量来逼近方程的根。

在每一次迭代中,牛顿法需要求解线性方程组,通常使用LU分解或者Cholesky分解等方法来加快求解速度。

直到满足收敛准则,即残差向量的范数小于一定的阈值,牛顿法计算结束。

优缺点:牛顿法具有收敛速度快和迭代次数较少的特点,尤其是在潮流计算中,对于大规模复杂系统具有良好的适应性。

然而,牛顿法也存在一些缺点。

首先,它需要计算雅可比矩阵和残差向量,计算量较大。

其次,当系统存在发电机停运或者馈线短路等异常情况时,牛顿法可能产生发散甚至不收敛的问题。

在Matpower中的应用:Matpower中的潮流计算函数runpf()默认使用了牛顿法进行潮流计算。

用户可以通过设置options结构体中的method参数为"NR"或者不设置method参数来使用牛顿法。

用户还可以通过设置tol参数来控制迭代的收敛准则。

2.快速分解法快速分解法是一种基于特征值分解的电力系统潮流计算方法,通过将复杂的潮流计算问题转化为求解特征值问题,利用特征值和特征向量对系统进行降维和分解,从而加快计算速度。

原理:快速分解法主要利用了电力系统节点的特征值和特征向量之间的关系,通过特征值的快速排序和特征向量的投影变换,将原始的潮流计算问题转化为求解特征值问题。

快速分解法可以根据特征值的大小来选择求解的精度,从而达到加快计算速度的目的。

优缺点:快速分解法在计算速度上具有优势,尤其是对于大规模系统和复杂情况,可以显著提高计算效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一:非线性方程求解
程序1:二分法:
syms f x;
f=input('请输入f(x)=');
A=input('请输入根的估计范围[a,b]='); e=input('请输入根的误差限e='); while (A(2)-A(1))>e
c=(A(1)+A(2))/2;
x=A(1);
f1=eval(f);
x=c;
f2=eval(f);
if (f1*f2)>0
A(1)=c;
else
A(2)=c;
end
end
c=(A(1)+A(2))/2;
fprintf('c=%.6f\na=%.6f\nb=%.6f\n',c,A)
用二分法计算方程:
1.请输入f(x)=sin(x)-x^2/2
请输入根的估计范围[a,b]=[1,2]
请输入根的误差限e=0.5e-005
c=1.404413
a=1.404411
b=1.404415
2.请输入f(x)=x^3-x-1
请输入根的估计范围[a,b]=[1,1.5]
请输入根的误差限e=0.5e-005
c=1.324717
a=1.324715
b=1.324718
程序2:newton法:
syms f x;
f=input('请输入f(x)=');
df=diff(f); x0=input('请输入迭代初值x0=');
e1=input('请输入奇异判断e1=');
e2=input('请输入根的误差限e2=');
N=input('请输入迭代次数限N=');
k=1;
while (k<N)
x=x0;
if abs(eval(f))<e1
fprintf('奇异!\nx=%.6f\n迭代次数为:%d\n',x0,k)
break
else
x1=x0-eval(f)/eval(df);
if abs(x1-x0)<e2
fprintf('x=%.6f\n迭代次数为:%d\n',x1,k)
break
else
x0=x1;
k=k+1;
end
end
end
if k>=N
fprintf('失败\n')
end
用newton法计算方程:
1.请输入f(x)=x*exp(x)-1
请输入迭代初值x0=0.5
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
x=0.567143
迭代次数为:4
2.请输入f(x)=x^3-x-1
请输入迭代初值x0=1
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
x=1.324718
迭代次数为:5
3.1:请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.45
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
x=0.500000
迭代次数为:4
3.2:请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.65
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
x=0.500000
迭代次数为:9
3.3:请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.55
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
x=0.500000
迭代次数为:4
程序3:改进的newton法:
syms f x;
f=input('请输入f(x)=');
df=diff(f);
x0=input('请输入迭代初值x0=');
e1=input('请输入奇异判断e1=');
e2=input('请输入根的误差限e2=');
N=input('请输入迭代次数限N=');
k=1;
while (k<N)
x=x0;
if abs(eval(f))<e1
fprintf('奇异!\nx=%.6f\n迭代次数为:%d\n',x0,k)
break
else
x1=x0-2*eval(f)/eval(df);
if abs(x1-x0)<e2
fprintf('x=%.6f\n迭代次数为:%d\n',x1,k)
break
else
x0=x1;
k=k+1;
end
end
end
if k>=N
fprintf('失败\n')
end
用改进的newton法计算方程:
1.请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.55
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=10
失败
2.请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.55
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=20
失败
3.请输入f(x)=(x-1)^2*(2*x-1)
请输入迭代初值x0=0.55
请输入奇异判断e1=0.1e-010
请输入根的误差限e2=0.5e-005
请输入迭代次数限N=100
失败。

相关文档
最新文档