matlab实现牛顿迭代法求解非线性方程组

合集下载

非线性方程求解

非线性方程求解

⾮线性⽅程求解基于MATLAB的⾮线性⽅程的五种解法探讨摘要:本⽂利⽤matlab软件对⾮线性⽅程解法中的⼆分法、简单迭代法、⽜顿法、割线法以及Steffensen法的数值分析⽅法的算法原理及实现⽅法进⾏了探讨。

对f x x x=+-()2ln2的零点问题,分别运⽤以上五种不同的⽅法进⾏数值实验,⽐较⼏种解法的优缺点并进⾏初步分析评价。

关键词:⼆分法、简单迭代法、⽜顿法、割线法、Steffensen法1、引⾔在很多实际问题中,经常需要求⾮线性⽅程f(x) =0的根。

⽅程f(x) =0的根叫做函数f(x)的零点。

由连续函数的特性知:若f(x)在闭区间[a,b ]上连续,且()()0f a f b<.则f(x) =0在开区间(a,b)内⾄少有⼀个实根。

这时称[a,b]为⽅程f(x) =0的根的存在区间。

本⽂主要对⾮线性⽅程的数值解法进⾏分析,并介绍了⾮线性⽅程数值解法的五种⽅法。

并设=+-.f x x x()2ln2f x在[1,2]上的图形,如图1:. 显然,函数在[1,2]之间有⼀个零点。

⾸先画出()2、计算机配置操作系统Windows 7 旗舰版内存2GB处理器AMD 4核 A6-3400M APU 1.4GHz图.13、⼆分法⼆分法的基本思想是将⽅程根的区间平分为两个⼩区间,把有根的⼩区间再平分为两个更⼩的区间,进⼀步考察根在哪个更⼩的区间内。

如此继续下去,直到求出满⾜精度要求的近似值。

设函数()f x 在区间[a,b ]上连续,且f(a)·f(b) <0,则[a,b ]是⽅程f(x) =0的根的存在区间,设其内有⼀实根,记为x*。

取区间[a,b ]的中点()2k a b x +=并计算1()f x ,则必有下列三种情况之⼀成⽴: (1) 1()f x =0,x1就是⽅程的根x*;(2)()f a .1()f x <0,⽅程的根x*位于区间[a, 1x ]之中,此时令111,a a b x ==; (3)1()f x .()f b <0,⽅程的根x*位于区间[1x ,b ]之中,此时令11a x =,1b b =。

matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到0.00001————————————————————————————————首先建立函数fun储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x);%定义非线性方程组如下%变量x1 x2 x3%函数f1 f2 f3syms x1 x2 x3f1=3*x1-cos(x2*x3)-1/2;f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;f=[f1 f2 f3]; ————————————————————————————————建立函数dfun用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:function df=dfun(x);%用来求解方程组的雅克比矩阵储存在dfun中f=fun(x);df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];df=conj(df');————————————————————————————————编程牛顿法求解非线性方程组将newton.m保存到工作路径中:function x=newton(x0,eps,N);con=0;%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N;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)});x=x0-f/df;for j=1: length(x0);il(i,j)=x(j);endif norm(x-x0)<epscon=1;break;endx0=x;end%以下是将迭代过程写入txt文档文件名为iteration.txtfid=fopen('iteration.txt','w');fprintf(fid,'iteration');for j=1:length(x0)fprintf(fid,' x%d',j);endfor j=1:ifprintf(fid,'\n%6d ',j);for k=1:length(x0)fprintf(fid,' %10.6f',il(j,k));endendif con==1fprintf(fid,'\n计算结果收敛!');endif con==0fprintf(fid,'\n迭代步数过多可能不收敛!'); endfclose(fid);————————————————————————————————运行程序在matlab中输入以下内容newton([0.1 0.1 -0.1],0.00001,20)————————————————————————————————输出结果——————————————————————————————————————————在iteration中查看迭代过程iteration x1 x2 x3.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;endendx0=[0 0 0];[r,n,data]=budong(x0);disp('不动点计算结果为')x1=[1 1 1];x2=[2 2 2];[x,n,data]=new_ton(x0);disp(’初始值为0,牛顿法计算结果为:’)[x,n,data]=new_ton(x1);disp('初始值为1,牛顿法计算结果为:')[x,n,data]=new_ton(x2);disp ('初始值为2,牛顿法计算结果为:')budong.mfunction[r,n,data]=budong(x0, tol)if nargin=-1tol=1e-3:x1=budong fun(x0);n=1;while(norm(x1-x0))tol)&(n500)x0=x1;x1=budong_fun(x0);n=n+1:data(:,n)=x1;endr=x1:new_ton.mfunction [x,n,data]=new_ton(x0, tol) if nargin=-1tol=1e-8;endx1=x0-budong_fun(x0)/df1(x0);n=1;while (norm(x1-x0))tol)x0=x1;x1=x0-budong_fun(x0)/df1(x0);n=n+1;data(:,n)=x1;x=x1;budong_fun.mfunction f=budong_fun(x)f(1)=3* x(1)-cos(x(2)*x(3))-1/2;f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.0 6;f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;f=[f(1)*f(2)*f(3)];df1.mfunction f=df1(x)f=[3sin(x(2)*x(3))*x(3) sin(x(2)*x(3))*x(2)2* x(1)-162*(x(2)+0.1)cos(x(3))exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20];结果:不动点计算结果为r=1.0e+012*NaN -Inf 5.6541初始值为0,牛顿法计算结果为:x=0.5000 -0.0000 -0.5236 初始值为1,牛顿法计算结果为:x=0.5000 0.0000 -0.5236 初始值为2,牛顿法计算结果为:x=0.5000 0.0000 -0.5236。

牛顿迭代法解非线性方程组(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实现

非线性方程组求解的牛顿迭代法用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和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.

非线性方程求解实验报告

非线性方程求解实验报告

数学实验报告非线性方程求解一、实验目的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中,我们可以使用多种方法来求解隐函数,包括牛顿迭代法、区间二分法、割线法等。

下面将介绍一种常用的方法——牛顿迭代法,以及MATLAB中的相关函数和用法。

一、牛顿迭代法求解隐函数牛顿迭代法是一种基于导数计算的求解非线性方程的方法,通过不断迭代逼近方程的根。

对于求解隐函数方程F(x, y) = 0,可以使用以下迭代公式进行计算:```x(k+1) = x(k) - F(x(k), y(k))/F'(x(k), y(k))y(k+1) = y(k) - F(x(k), y(k))/F'(x(k), y(k))```其中,k为迭代次数,F'(x(k), y(k))为F关于x和y的偏导数。

二、MATLAB中的隐函数求解函数在MATLAB中,可以使用fzero函数和fsolve函数来求解隐函数。

下面分别介绍这两个函数的使用方法。

1. fzero函数fzero函数用于求解单变量的非线性方程,可以用于求解隐函数中的一个变量。

使用方法如下:```x = fzero(@fun, x0)```其中,@fun为自定义的函数句柄,表示隐函数F(x, y)=0中与变量x相关的表达式。

x0为迭代初始值。

2. fsolve函数fsolve函数用于求解多变量的非线性方程组,可以用于求解隐函数中多个变量。

使用方法如下:```[x, y] = fsolve(@fun, [x0, y0])```其中,@fun为自定义的函数句柄,表示隐函数F(x, y)=0中与变量x和y相关的表达式。

[x0, y0]为迭代初始值。

三、MATLAB中的隐函数求解示例假设我们需要求解隐函数方程sin(x) + cos(y) = 1,我们可以使用MATLAB的fzero函数和fsolve函数进行求解。

matlab牛顿迭代法求方程组的根

matlab牛顿迭代法求方程组的根

MATLAB(矩阵实验室)是一种用于数学计算、绘图等的高度工程化的软件评台。

利用MATLAB进行牛顿迭代法求解方程组的根是一种常见的数值分析方法。

本文将介绍如何使用MATLAB进行牛顿迭代法求解方程组的根,并给出具体的代码实现。

1. 理论基础牛顿迭代法是一种求解方程根的常用数值方法。

对于一般的方程组F(X)=0,牛顿迭代法的迭代公式如下:X(k+1)=X(k)−(∂F/∂X)^(-1)·F(X(k))其中,X(k)表示第k次迭代的解,∂F/∂X表示F对X的雅可比矩阵,^(-1)代表矩阵的逆运算。

2. MATLAB代码实现以下是使用MATLAB进行牛顿迭代法求解方程组的一般代码实现:```matlabfunction [x, numIter] = newtonMethod(F, J, x0, tol, maxIter)F为方程组F(X)=0的函数句柄J为方程组F(X)的雅可比矩阵的函数句柄x0为初始解向量tol为迭代精度maxIter为最大迭代次数x = x0;numIter = 0;while norm(F(x)) > tol numIter < maxIterx = x - J(x) \ F(x); 使用MATLAB的\表示矩阵的逆运算numIter = numIter + 1;endend```3. 示例下面以一个二元非线性方程组为例,演示如何使用上述MATLAB代码进行牛顿迭代法求解方程组的根。

考虑方程组:F1(x1, x2) = x1^2 + x2^2 - 25 = 0F2(x1, x2) = x1*x2 - 9 = 0对应的雅可比矩阵为:J(x)=[2x1, 2x2; x2, x1]下面是具体的MATLAB代码实现:```matlab定义方程组F和雅可比矩阵JF = (x) [x(1)^2 + x(2)^2 - 25; x(1)*x(2) - 9];J = (x) [2*x(1), 2*x(2); x(2), x(1)];设置初始解向量、迭代精度和最大迭代次数x0 = [1; 1];tol = 1e-6;maxIter = 100;调用newtonMethod函数进行求解[x, numIter] = newtonMethod(F, J, x0, tol, maxIter);显示结果disp(['解向量为:', num2str(x')]);disp(['迭代次数为:', num2str(numIter)]);```4. 结论本文介绍了使用MATLAB进行牛顿迭代法求解方程组的方法,并给出了具体的代码实现和示例。

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)< p="">break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;max1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<delta< p="">break;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');for k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilon< p="">break;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。

非线性方程组计算

非线性方程组计算

在科学与工程计算中,经常遇到求解非线性方程组的问题;非线性方程组在收敛速度及收敛性比线性方程组要差,特别对于非凸的非线性方程组,其求解更是困难。

下面简要介绍非线性方程组的三种解法——牛顿法、拟牛顿法、同伦算法,分析三种解法的适用性,并附Matlab 原程序。

(一)、牛顿迭代法迭代公式为:x k+1=x k-f(x k)/f'(x k);牛顿迭代法是解非线性方程组比较经典的方法,在局部收敛点附近是平方收敛的;但其解依赖于初始解,且迭代每一步都要计算f'(x k),不仅计算量大而且有时会发生计算困难。

(二)、拟牛顿迭代法拟牛顿法是为了解决求Jacobi矩阵时带来的困难,现已成为解决非线性方程组和最优化问题的最有效方法之一。

其迭代格式为:x(k+1)=x(k)-A k-1F(x(k))A k+1=A k+[(y k-A k s k)(y k-A k s k)T]/[(y k-A k s k)T s k]在一定条件下,计算H的序列是超收敛的,但稳定性较差,有时迭代效果不理想。

(三)、同伦算法同伦算法基本思想是从容易求解的方程组开始,逐步过渡到原方程组的求解,从而得到问题的解。

非线性方程组为:F(x)=0,其解为X*。

构造泛函 G:[0,1]XR n->R nG定义为:G(λ,x)=λ F(x)+(1-λ)[F(x)-F(x(0))]=F(x)+(λ-1)F(x(0))(其中:x(0)为任意给的初值,假定为λ函数(λ=0))对于λ的方程G(λ,x)=0,当λ=0时,0=G(0,x)=F(x)-F(x(0));x(0)是方程的解;当λ=1时,0=G(1,x)=F(x);x*是方程的解,即x(1)=x*基于这个思想我们最后可以得到如下关系式:x'(λ)=-[J(x(λ))]-1F(x(0)) ( 0<=λ<=1,对初始值x(0) )J为雅可比矩阵,由上面的式子,对λ在[0,1]上积分,就可得到x*=x(1)上面的非线性方程组问题就转化为数值积分问题。

非线性方程(组)求解

非线性方程(组)求解

1.用matlab软件求方程的解
Matlab软件求方程f(x)=0近似解的命令是fzero,具体用法为: (1)建立函数:f=inline(‘表达式’)
(2)求函数零点:c=fzero(f,[a,b]) %求函数在区间内的零点 c=fzero(f,x0) %求函数f在x0附近的零点
an x a1 x a0 0
当前,运用混沌学来解决的实际问题主要有三类: 第一,实现高性能的神经计算机。人脑是按照能产生混沌现 的构造来形成自己的神经网络,从而呢处理复杂的信息. 第二,分析和预报自然现象和经济现象,例如地震预报、 经济发展预报等。 第三,提高大规模工程系统的可靠性。尽管目前利用混沌 理论进行长期预报误差还太大,但用于短期预报则 有相当的效果。
4.一般迭代法
设方程 f x 0 有实根,若能将方程等价地转化为 x g x ,
x1 g x0 , x2 g x1 ,

, xk 1 g xk ,
k 0,1, 2,
得到一个序列
xk k 1 ,称为由迭代函数g(x)产生的迭代序列.
2.用matlab求方程组的解
Matlab软件求上述非线性方程组的数值解命令是: [x,fval]=fsolve(fun,x0)
2 sin x1 x2 x3 e x1 4 0 的近似解. 示例3 求方程组 x1 x2 x3 0 x x x 0 1 2 3
x0称为迭代初始值. 若该迭代序列收敛,则它的 极限就是方程f(x)=0的一个根.
xk称为方程根的k次近似值.使 得迭代法收敛的初始值的取 值范围为迭代收敛域.
示例5 求方程 x x 3 0 的近似解.
2

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

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

由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。

使用Matlab进行迭代计算的方法

使用Matlab进行迭代计算的方法

使用Matlab进行迭代计算的方法引言:在科学计算和工程领域,迭代计算是一种常用的数值计算方法。

它通过多次迭代逼近解决方案,对于复杂问题具有很高的效率和准确性。

Matlab是一种强大的数值计算软件,具备丰富的工具箱和库,为迭代计算提供了便利。

本文将介绍使用Matlab进行迭代计算的方法,并探讨一些常见的迭代算法。

一、迭代计算的基本原理迭代计算是一种通过逐次逼近解决方案的数值计算方法。

它通常开始于一个近似解,通过多次迭代来逐步改进解的准确性,直到满足收敛条件或达到预设的迭代次数。

迭代计算的基本原理如下:1. 选择合适的初值:迭代计算的结果依赖于初始值的选择。

初值应该接近准确解,以便缩小误差范围。

2. 建立迭代模型:根据问题的特性和数学模型,建立迭代计算的基本形式。

通常,问题可以化为一个方程或者一组方程的求解。

3. 迭代逼近:从初始值开始,通过逐次迭代来逼近准确解。

每一次迭代都会产生一个更加精确的解,直到满足收敛条件。

4. 收敛判断:在每一次迭代之后,需要判断是否满足收敛条件。

常见的收敛条件有解的相对误差小于某个阈值,或者迭代次数达到预设的最大次数。

二、常见的迭代算法Matlab提供了多种迭代算法的函数和工具箱,下面将介绍几种常见的迭代算法以及在Matlab中的应用。

1. 简单迭代法:也称为迭代逼近法,是一种基本的迭代算法。

它适用于函数的连续可导且导数在某个区间内的绝对值小于1的情况。

简单迭代法的公式如下: x(i+1) = g(x(i))其中,g(x)为转化后的原方程,x(i)为第i次迭代的解,x(i+1)为第i+1次迭代的解。

在Matlab中,可以使用fzero函数结合匿名函数实现简单迭代法。

2. 牛顿迭代法:也称为牛顿-拉夫逊方法,是一种高效的迭代算法。

它通过利用函数的局部线性逼近来寻找解的迭代近似。

牛顿迭代法的公式如下: x(i+1) = x(i) - f(x(i))/f'(x(i))其中,f(x)为原方程,f'(x)为f(x)的导数,x(i)为第i次迭代的解,x(i+1)为第i+1次迭代的解。

非线性方程组的牛顿迭代法的应用

非线性方程组的牛顿迭代法的应用

非线性方程组的牛顿迭代法的应用CENTRAL SOUTH UNIVERSITY数值分析实验报告非线性方程组的牛顿迭代法的应用一、问题背景非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化的,为得到更符合实际的解答,往往需要直接研究非线性科学,它是21世纪科学技术发展的重要支柱,非线性问题的数学模型有无限维的如微分方程,也有有限维的。

道遥咏计算机进行科学计算都要转化为非线性的单个方程或方程组的求解。

从线性到非线性是一个质的变化,方程的性质有本质不同,求解方法也有很大差别。

本文主要介绍的是非线性方程组的牛顿迭代法的数值解法。

二、数学模型对于方程f x =0,如果f x湿陷性函数,则它的求根是容易的。

牛顿法实质上是一种线性化方法,其基本思想是将线性方程 f x =0逐步归结为某种线性方程来求解。

设已知方程f x =0有近似根X k (假定f X k - 0),将函数f x在点X k展开, 有f X : f X k f' X k X -X k ,于是方程f X = 0可近似地表示为f X k f' X k x - X k =0这是个线性方程,记其根为X ki,则X k 的计算公式f(Xk)k 01...X ki =X k ;,k=01,f区)这就是牛顿法。

三、算法及流程对于非线性方程飞仅鸡丄区)1 f2(X i,X2 丄,X n ) f =M」n(X i ,X2,L,X n )在x k处按照多元函数的泰勒展开,并取线性项得到fjx*),X2(k )丄,XnC ))1 -X1(“)_X1(k )〕 fzgt 以^)丄%$))十f'(x (k))X2(kT —X2(k)MM ' fn(x/k凡卜),L,Xn&))1 〕X 0L Xn ®这边是牛顿迭代法的算法过程,牛顿迭代法是工程上应用最多的一种非线性方 程组的计算方程法。

matlab非线性方程的解法(含牛拉解法)

matlab非线性方程的解法(含牛拉解法)

非线性方程的解法(含牛拉解法)1引 言数学物理中的许多问题归结为解函数方程的问题,即,0)(=x f (1.1) 这里,)(x f 可以是代数多项式,也可以是超越函数。

若有数*x 为方程0)(=x f 的根,或称函数)(x f 的零点。

设函数)(x f 在],[b a 内连续,且0)()(<b f a f .根据连续函数的性质知道,方程0)(=x f 在区间],[b a 内至少有一个实根;我们又知道,方程0)(=x f 的根,除了极少简单方程的根可以用解析式表达外,一般方程的根很难用一个式子表达。

即使能表示成解析式的,往往也很复杂,不便计算。

所以,具体求根时,一般先寻求根的某一个初始近似值,然后再将初始近似值逐步加工成满足精度要求为止.如何寻求根的初始值呢?简单述之,为了明确起见,不妨设)(x f 在区间],[b a 内有一个实的单根,且0)(,0)(><b f a f .我们从左端出点a x =0出发,按某一预定的步长h 一步一步地向右跨,每跨一步进行一次根的“搜索”,即检查每一步的起点k x 和1+k x (即,h x k +)的函数值是否同号。

若有:0)(*)(≤+h x f x f k k (1.2) 那么所求的根必在),(h x x k k +内,这时可取k x 或h x k +作为根的初始近似值。

这种方法通常称为“定步长搜索法"。

另外,还是图解法、近似方程法和解析法。

2 迭代法2。

1 迭代法的一般概念迭代法是数值计算中一类典型方法,不仅用于方程求根,而且用于方程组求解,矩阵求特征值等方面。

迭代法的基本思想是一种逐次逼近的方法。

首先取一个精糙的近似值,然后用同一个递推公式,反复校正这个初值,直到满足预先给定的精度要求为止。

对于迭代法,一般需要讨论的基本问题是:迭代法的构造、迭代序列的收敛性天收敛速度以及误差估计。

这里,主要看看解方程迭代式的构造。

对方程(1。

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。

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

matlab实现牛顿迭代法求解非线性方程组
已知非线性方程组如下
3*x1-cos(x2*x3)-1/2=0
x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0
exp(-x1*x2)+20*x3+(10*pi-3)/3=0
求解要求精度达到0.00001 ————————————————————————————————
首先建立函数fun
储存方程组编程如下将fun.m保存到工作路径中:
function f=fun(x);
%定义非线性方程组如下
%变量x1 x2 x3
%函数f1 f2 f3
syms x1 x2 x3
f1=3*x1-cos(x2*x3)-1/2;
f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;
f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;
f=[f1 f2 f3]; ————————————————————————————————
建立函数dfun
用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:
function df=dfun(x);
%用来求解方程组的雅克比矩阵储存在dfun中
f=fun(x);
df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];
df=conj(df'); ————————————————————————————————
编程牛顿法求解非线性方程组将newton.m保存到工作路径中:
function x=newton(x0,eps,N);
con=0;
%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N;
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)});
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;
end
%以下是将迭代过程写入txt文档文件名为iteration.txt
fid=fopen('iteration.txt','w');
fprintf(fid,'iteration');
for j=1:length(x0)
fprintf(fid,' x%d',j);
end
for j=1:i
fprintf(fid,'\n%6d ',j);
for k=1:length(x0)
fprintf(fid,' %10.6f',il(j,k));
end
end
if con==1
fprintf(fid,'\n计算结果收敛!');
end
if con==0
fprintf(fid,'\n迭代步数过多可能不收敛!');
end
fclose(fid); ————————————————————————————————
运行程序在matlab中输入以下内容
newton([0.1 0.1 -0.1],0.00001,20) ————————————————————————————————
输出结果
——————————————————————————————————————————在iteration中查看迭代过程 iteration x1 x2 x3
.mulStablePoint用不动点迭代法求非线性方程组的一个根
function [r,n]=mulStablePoint(F,x0,eps)
%非线性方程组:f
%初始解:a
%解的精度:eps
%求得的一组解:r
%迭代步数:n
if nargin==2
eps=1.0e-6;
end
x0 = transpose(x0);
n=1;
tol=1;
while tol>eps
r= subs(F,findsym(F),x0); %迭代公式
tol=norm(r-x0); %注意矩阵的误差求法,
norm为矩阵的欧几里德范数
n=n+1;
x0=r;
if(n>100000) %迭代步数控制
disp('迭代步数太多,可能不收敛!');
return;
end
end
x0=[0 0 0];
[r,n,data]=budong(x0);
disp('不动点计算结果为')
x1=[1 1 1];
x2=[2 2 2];
[x,n,data]=new_ton(x0);
disp(’初始值为0,牛顿法计算结果为:’)
[x,n,data]=new_ton(x1);
disp('初始值为1,牛顿法计算结果为:')
[x,n,data]=new_ton(x2);
disp ('初始值为2,牛顿法计算结果为:')
budong.m
function[r,n,data]=budong(x0, tol)
if nargin=-1
tol=1e-3:
end
x1=budong fun(x0);
n=1;
while(norm(x1-x0))tol)&(n500)
x0=x1;
x1=budong_fun(x0);
n=n+1:
data(:,n)=x1;
end
r=x1:
new_ton.m
function [x,n,data]=new_ton(x0, tol)
if nargin=-1
tol=1e-8;
end
x1=x0-budong_fun(x0)/df1(x0);
n=1;
while (norm(x1-x0))tol)
x0=x1;
x1=x0-budong_fun(x0)/df1(x0);
n=n+1;
data(:,n)=x1;
end
x=x1;
budong_fun.m
function f=budong_fun(x)
f(1)=3* x(1)-cos(x(2)*x(3))-1/2;
f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06; f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;
f=[f(1)*f(2)*f(3)];
df1.m
function f=df1(x)
f=[3sin(x(2)*x(3))*x(3) sin(x(2)*x(3))*x(2) 2* x(1)-162*(x(2)+0.1)cos(x(3))
exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20]; 结果:
不动点计算结果为
r=
1.0e+012*
NaN -Inf 5.6541
初始值为0,牛顿法计算结果为:
x=
0.5000 -0.0000 -0.5236
初始值为1,牛顿法计算结果为:
x=
0.5000 0.0000 -0.5236
初始值为2,牛顿法计算结果为:
x=
0.5000 0.0000 -0.5236。

相关文档
最新文档