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实现牛顿迭代法求解非线性方程组已知非线性方程组如下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版)⽜顿迭代法,⼜名切线法,这⾥不详细介绍,简单说明每⼀次⽜顿迭代的运算:⾸先将各个⽅程式在⼀个根的估计值处线性化(泰勒展开式忽略⾼阶余项),然后求解线性化后的⽅程组,最后再更新根的估计值。
下⾯以求解最简单的⾮线性⼆元⽅程组为例(平⾯⼆维定位最基本原理),贴出源代码: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实验一:非线性方程求解-牛顿法实验一:非线性方程求解程序1:二分法:syms f x;f=input('请输入f(x)=');A=input(’请输入根的估计范围[a,b]=’);e=input('请输入根的误差限e=’);while (A(2)—A(1))>ec=(A(1)+A(2))/2;x=A(1);f1=eval(f);x=c;f2=eval(f);if (f1*f2)〉0A(1)=c;elseA(2)=c;endendc=(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-005c=1.404413a=1。
404411b=1.4044152.请输入f(x)=x^3—x-1请输入根的估计范围[a,b]=[1,1.5]请输入根的误差限e=0.5e-005c=1。
324717a=1。
324715b=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)breakelsex1=x0—eval(f)/eval(df);if abs(x1-x0)<e2fprintf('x=%。
6f\n迭代次数为:%d\n’,x1,k)breakelsex0=x1;k=k+1;endendendif k〉=Nfprintf('失败\n')end用newton法计算方程:1.请输入f(x)=x*exp(x)—1请输入迭代初值x0=0。
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实现首先,我们需要定义非线性方程组。
假设我们要求解方程组:```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程序设计实践学长有爱奉献,下载填上信息即可上交,没有下载券的自行百度。
所需m文件照本文档做即可,即新建(FILE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。
第一题需要把数据文本文档和m文件放在一起。
全部测试无误,放心使用。
本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。
←记得删掉这段话班级:学号:姓名:一、《MATLAB程序设计实践》Matlab基础表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。
由于数据量非常大,不便于分析,需要借助图形来分析。
请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:(1)用Slice函数给出其整体分布特征;"~(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。
(备注:数据格式说明解:(1)((2)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:fid=fopen('');for i=1:18tline=fgetl(fid);endphi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19);[while ~feof(fid)tline=fgetl(fid);data=str2num(tline);line=line+1;数据说明部分,与作图无关此方向表示f随着φ1从0,5,10,15,20 …到90的变化而变化此方向表示f随着φ从0,5,10,15, 20 …到90的变化而变化表示以下数据为φ2=0的数据,即f(φ1,φ,0)if mod(line,20)==1phi2=(data/5)+1;phi=1;else~for phi1=1:19f(phi1,phi,phi2)=data(phi1);endphi=phi+1;endendfclose(fid);。
牛顿法解非线性方程(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实验1 解非线性方程实验
实验1 解非线性方程实验成绩实验类型:●验证性实验 ○综合性实验 ○设计性实验实验目的:进一步熟练掌握解非线性方程二分法算法、弦截法算法,提高编程能力和解算非线性方程问题的实践技能。
实验内容:用二分法算法、牛顿迭代法,弦截法算法解算非线性方程,,计算=0的根实验原理二分法算法牛顿迭代法弦截法算法实验步骤1 要求上机实验前先编写出程序代码2 编辑录入程序3 调试程序并记录调试过程中出现的问题及修改程序的过程4 经反复调试后,运行程序并验证程序运行是否正确。
5 记录运行时的输入和输出。
实验总结实验报告:根据实验情况和结果撰写并递交实验报告。
参考程序一.二分法算法1.建立二分法的函数文件bisect.mfunction [c,err,yc]=bisect(f,a,b,delta)%Iput - f is the function input as a string 'f'% -a and b are the left and right end points % -delta is the tolerance%Output -c is the zero point% -yc=f(c)% -err is the error estimate for cya=feval(f,a);yb=feval(f,b);if ya*yb > 0,return,endmax1=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,break,endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);2.建立f(x)=x^2-5的matlab函数文件fff.mfunction y=fff(x);y=x.^2-5;3.在命令窗口中准备调用bisect函数的实参>> a=2;>> b=3;>> delta=0.0001;4.在命令窗口中调用bisect函数>> [x,err,yx]=bisect('fff',a,b,delta)x =2.2361err =6.1035e-005yx =-6.4894e-005>> [x,err,yx]=bisect('fff',a,b,delta)x =-2.2361err =6.1035e-005yx =-6.4894e-005二.牛顿迭代法1.建立牛顿迭代法的函数文件newton.mfunction [p0,err,k,y]=newtow(f,df,p0,delta,epsilon,max1)%Input -f is the object function input as a string 'f'% -df is the derivative of f input as a string 'df'% -p0 is the initial approximation to a zero o f% -delta is the tolerance for the function values y% -max1 is the maximum number of iterations%Output -p0 is the Newton-Raphson approximation to the zero % -err is the error estimate for p0% -k is the number of iteration% -y is the function value f(p0)for k=1:max1p1=p0-feval(f,p0)/feval(df,p0);err=abs(p1-p0);relerr=2*err/(abs(p1)+delta);p0=p1;y=feval(f,p0);if (err<delta)|(relerr<delta)|(abs(y)<epsilon),break,end end3.在命令窗口中准备调用newton函数的实参>> p0=2;>> delta=0.0001;>> epsilon=0.00001;>> max1=1000max1 =1000>> p0=-2;4.在命令窗口中调用newton函数>> [x,err,k,y]=newton('fff','ff',p0,delta,epsilon,max1)x =2.2361err =4.3133e-005k =3y =1.8605e-009>> [x,err,k,y]=newton('fff','ff',p0,delta,epsilon,max1)x =-2.2361err =4.3133e-005k =3y =1.8605e-009三.弦截法算法1.建立弦截法算法的函数文件secant.mfunction [p1,err,k,y]=secant(f,p0,p1,delta,epsilon,max1) for k=1:max1p2=p1-feval(f,p1)*(p1-p0)/(feval(f,p1)-feval(f,p0)); err=abs(p2-p1);relerr=2*err/(abs(p2)+delta);p0=p1;p1=p2;y=feval(f,p1);if(err<delta)|(relerr<delta)|(abs(y)<epsilon),break,end end2.建立f(x)=x^2-5的matlab函数文件fff.mFunction y=fff(x)y=x.^2-5;3.在命令窗口中准备调用secant函数的实参>> p0=2;>> p1=2.2;>> delta=0.0001;>> epsilon=0.00001;>> max1=1000;>> p0=-2.5;>> p1=-2;4.在命令窗口中调用secant函数>> [x,err,k,y]=secant('fff',p0,p1,delta,epsilon,max1) x =2.2361err =1.6468e-005k =3y =-3.3385e-008>> [x,err,k,y]=secant('fff',p0,p1,delta,epsilon,max1) x =-2.2361err =1.1287e-004k =3y =-2.2882e-007。
基于MATLAB的《数值分析》之实验教程:非线性方程求解
实验3 非线性方程求解1、实验目的1)掌握常用的非线性方程的求解算法,包括不动点迭代、二分法、试值法、牛顿法和割线法;2)并通过数值算例理求根解算法的收敛速度和健壮性。
2、实验内容1)编程实现二分法、试值法、牛顿法和割线法的MATLAB 函数。
2)设2)(31--=x x x f .(1) 确定f (x )=0实根的有根区间;(2) 取合适的初始值或初始区间,用不动点迭代算法、二分法、试值法、牛顿法和割线法程序分别求出f (x )=0具有10位或以上有效数字的实根,用MATLAB 自带的fzero 函数求出的结果计算误差,用tic/toc 命令记录程序运行时间,对每一个求出的实根,填写下表:(3) 从上表中可得出什么结论?4、实验思考1)二分法收敛速度慢,但是适用条件简单容易判断;牛顿法收敛速度快但收敛条件不易判断。
能否设计一种混合算法,既保持计算过程的稳健性(不易失效),又能够在条件允许的情况下采用更高阶的计算格式。
2)MATLAB内置的求根函数fzero的算法逻辑是怎样的?5、实验习题1)结合二分法、试值法、牛顿法和割线法各自的特点,设计一种兼顾健壮性和收敛速度的混合算法,能够自适应地判断求根函数在给定的初值附近的形态,选择合适的方法进行求根。
2)一个实心球体浮在水面上,根据阿基米德原理,球体的浮力和球体排出水的重量相等。
令V s = (4/3)πr3为球的体积,Vω为球体局部浸入水中时排出水的体积。
在静态平衡的状态下,球的重量和水的浮力相等,ρgV s = ρw gV w或sV s = V w其中是ρ球体密度,g是重力加速度,ρw是水的密度,s = ρ/ρw是球体材料的比重,它决定球体沉入水面的深度。
如图,球体高度为h部分的体积为V h=(π/3)(3rh2-h3).假设球体半径为r=10cm, 密度为ρ=0.638,求球体浸入水中的质量为多少?。
信息与计算科学系Matlab软件实习(论文)——非线性方程求根
Matlab软件实习论文非线性方程求根系别信息与计算科学专业信息与计算科学学号姓名指导教师2008年8 月10 日非线性方程求根摘要随着科学技术,生产力经济的发展,在科学与工程计算中存在着大量方程求根问题,例如贷款购房问题,工厂的最佳订货问题等都需要求解一类非线性方程的根,而本文就针对这些求根问题提出了解决方案,本文利用牛顿迭代法来结决方程的求根问题.首先根据实际问题列出数学模型,确定变量,给出各个条件及相关函数;然后对建立的模型进行具体分析和研究,选择合适的求解方法;编写函数的程序,用计算机求出方程的解,通过所求解分析具体情况.关键词:非线性方程,牛顿迭代法,Matlab目录摘要 (I)1 绪论 (1)1.1非线性方程求根的背景 (1)1.2非线性方程求根的目的: (1)1.3非线性方程求根的内容: (1)2 牛顿迭代法的实现及应用 (3)2.1N EWTON迭代法具体例子的实现 (3)2.2应用牛顿法解决购房贷款利率问题 (4)2.3应用牛顿迭代法计算最佳订货量 (6)结论 (8)参考文献 (9)1 绪 论1.1 非线性方程求根的背景随着社会的进步,科学技术的快速发展,各种工程等也如雨后春笋一般破土而出,对我们的日常生活产生了巨大的影响如天气预报、石油的勘探、地质灾害的预报等.牛顿迭代法是牛顿在17世纪提出的一种求解方程()0f x =.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.而在各种科学和工程计算中往往要用到非线性方程组的求解,而牛顿法又是最基础的迭代法,在各种计算力学、控制工程等领域中发挥了不可代替的作用.而在数值计算中,非线性方程组的求解同样具有重要意义.随着计算机技术的成熟和高速发展,对于非线性方程求根问题出现了大量的数学软件(如MATLAB,Matheamatica,Maple,SAS,SPSSD 等),计算机已经成为工程师应用数学解决工程问题的主要运算工具.同时,工程专业的学生对数学教育的需求重点正在从手工演绎和运算能力的培养转变到结合计算机软件进行建模、求解和论证能力的培养[]1.本文采用Matlab 作为软件平台,介绍了非线性方程求根的内容.1.2 非线性方程求根的目的为了推动科学的进步,能够很简便的完成各种工程计算,非线性方程组的求解方法以其独有的方法解决了各种计算,为今天以及将来的应用打下了坚实的基础.非线性方程组的求解正是为了这个目的才广泛被人们应用,此文也将给出非线性方程组求解的实际应用.1.3 非线性方程求根的内容解非线性方程()0f x =的主要算法是迭代法,如fsolve 、二分法、牛顿迭代法等.迭代法是从已知的解的初始近似值0 x (简称初值)开始,利用某种迭代格式( )x g x =求得一近似值序列121,,,,,k k x x x x +逐步逼近于所求的解α(称为不动点).这一方法是否成功取决于三个因素,首先 ( )x g x =应与()0f x =同解,其次初值0 x 的选取是否合适,一般要与真解靠近,最后也是最关键的是迭代序列是否收敛,为了保证收敛性,在真解附近应有'| ()|1g x <否则迭代序列可能发散.最基本的迭代法是Newton 迭代法,其迭代格式为1'()()k k k k f x x x f x +=-. 从几何上说1k x +为用 ()f x 在 k x 出切线代替 ()f x 求得的解,所以也称为切线法,当初值0 x 与真值α足够靠近,Newton 迭代法收敛.对于单根,Newton 法收敛速度很快;对于重根,收敛较慢.牛顿迭代法的大概算法为:给定初始值0x ,ε为根的容许误差,η为()f x 的容许误差,N 为迭代次数的容许值.① 如果'0()0f x =或迭代次数大于N ,则算法失败,结束;否则执行② ② 计算010'0()()f x x x f x =-③ 若10x x ε-<或1()f x η<,则输出1x ,程序结束;否则执行④ ④ 令01x x =,转向①下面给出了Newton 迭代法的计算程序. function x=newton(fname,dfname,x0,e) %用途:Newton 迭代法解非线性方程f(x)=0%格式:x=nanewton( fname,dfname,x0,e) x 返回数值解, %fname 和dfname 分别表示f(x)及其导函数 %f'(x),x0为迭代初值,e 精度要求(默认为1e-4) if nargin<4,e=1e-4; %精度默认为1e-4 endx=x0;x0=x+2*e; %使while 成立,进入while 后x0得到赋值 while abs(x0-x)>e x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); end2 牛顿迭代法的实现及应用2.1 Newton 迭代法具体例子的实现用Newton 迭代法解方程 32() -3-30 f x x x x =+= 在1.5附近的根.解:当2x >时,()0, ()0f x f x >>,即()f x 恒正,所以根在[0,2].我们先用图解法找初值,在用Newton 法程序newton.m 求解.fun= inline('x^3+x^2-3*x-3'); fplot(fun,[0,2]); grid on;图 2.1 ()f x 的函数图像由图可知方程有唯一正根在[1.6,1.8]之间,我们取初值1.5代入Newton 程序中. dfun=inline('3*x^2+2*x-3'); format long;newton(fun,dfun,1.5,1e-4); format short; ans =1.73205080756888而用Matlab 本身的函数fzero 求出来的结果为: format long;fzero(inline('x^3+x^2-3*x-3'),1.5); format short ans =1.73205080756888下面用牛顿迭代法解决一些实际问题 2.2 应用牛顿法解决购房贷款利率问题住房是居民消费的一个主要部分,大部分人选择银行按揭贷款,然后在若干年内逐月分期还款.如果你借了10万,还款额一定超过10万.设贷款总额为0x ,贷款期限为N 个月,采取逐月等额方式偿还本息.若k x 为第k 个月的欠款数,a 为月还款,r 为月利率.我们得到些列迭代关系式1 (1) - ,k k x r x a +=+那么1(1)k k x r x a -=+-22(1)(1)k r x r a a -=+-+-= 210(1)[1(1)(1)]k r x a r r -=+-+++++0(1)[(1)1]/k k r x a r r =+-+-, 由此可以得到月还款计算公式(1)(1)1N Nr x a r +=+-下面是《新民晚报》2000年3月30日第七版上的一则房产广告:不难算出,你向银行总共借了25.2万,30年内共要还51.96万,约为当初借款的两倍.这个案例中的贷款年利率是多少呢?我们根据a =0.1436, 0x =25.2, 360N =,由以上a 的求解公式得到:360360++=.25.2(1)-0.1436[(1)-1]0r r r我们令360360=++,( ) 25.2(1)-0.1436[(1)-1]f r r r r则次问题就转化成非线性方程求根的问题,令( )0,f r=求出r.我们先用Newton函数求解.在Matlab中输入如下程序:常识上,r应比当时活期存款月利率略高一些.我们用当时的活期存款月利率0.0198/2作为迭代初值,为了剔除0r=这个没有意义的根,我们对( )f r稍作变形:clear;fun=inline('25.2*(1+r)^360/0.1436-((1+r)^360-1)/r','r')fun =Inline function:fun(r) = 25.2*(1+r)^360/0.1436-((1+r)^360-1)/rdfun=inline('25.2*360*(1+r)^359/0.1436-(360*(1+r)^359*r-((1+r)^360-1))/(r^2)');r=newton(fun,dfun,0.0198/2,1e-4);R=12*r然后求得结果:R =0.0553于是得出年利率为 5.53%.下面我们用Matlab中的fzero函数检验一下:clear;fun=inline('25.2*(1+r)^360-((1+r)^360-1)/r*0.1436','r')fun =Inline function:fun(r) = 25.2*(1+r)^360-((1+r)^360-1)/r*0.1436r=fzero(fun,0.0198/2);R=12*rR =0.0553结果相同,可见牛顿迭代法的正确性. 2.3 应用牛顿迭代法计算最佳订货量汽车工厂为了保证生产的正常运作,配件供应一定要由保障.这些配件并不是在市场上随时可以买到的,所以往往要预先从配件供应商那里定货.由于配件供应商并不是生产单一产品,为你的定货必须要在流水线上作出调整,所以每次定货需要收取一定量的生产准备费.配件供应商的生产能力很大,开工后很快可以生产许多配件,但是你的汽车工厂并不是立即需要这么多,往往要在仓库里储存一段时间,为此你要付出储存费.如果订货量很小,必然需要频繁定货,造成生产准备费的增加;反之,若订货量很大,定货周期必然延长,生产准备费下降,但这样会造成储存费的增加.如何确定合适的订货量?实践中,这是一个相当复杂的问题,因为市场波动的影响是多方面的.我们先作一些必要的假设将问题简化.1) 汽车工厂对配件的日需量是恒定的,每日为r 件; 2) 所订配件按时一次性交货,生产准备费每次1 k 元; 3) 储存费按当日实际储存量计算,储存费每日每件2k 元; 4) 你的工厂不许缺货.设一次定货x 件,由于工厂不允许缺货,而为了节省存储费,交货日期应定为恰好用完时,所以定货日期/.T x r = (1)由于日需求量是恒定的,可以计算出第t 天的存储量为( )-, 0.q t x rt t T =<< (2)由于第t 天的储存费为2k q( t ),一个周期的总储存费为2201()()TTt t k q t k q t d -≈∑⎰. (3)根据(1),(2),(3)得到一个周期总费用212() 2x C x k k r=+,优化目标是使单位产品费用12()()2k k xC x f x x x r==+, 达到最小.由'()0f x =即122-02k k x r+=, 可直接解得x =这就是著名的经济批量定货公式. 当我们给出具体值时,非线性方程就可以求解了,由于具体的值不定,在此就不给出具体程序了.结论通过以上的论述我们可以知道计算机在现代生活中的应用已经如此普及,尤其是在数学计算当中,Matlab软件更是发挥了不可替代的作用.Matlab以其强大的功能,方便了当今数值计算,数学教程,及工程计算等众多领域.本文在以Matlab软件为平台的基础上,给出了非线性方程的一般解法,非线性方程的求解有二分法,牛顿迭代法,简单牛顿法,牛顿下山法,弦截法,抛物线法等.二分法的优点是算法简单,且总是收敛的,但由于二分法的收敛速度太慢,故一般不单独将其用于求根,只用其为根求得一个较好的近似[]2值.其他的求根方法各有优缺点,这里就不一一赘述.本文主要介绍了牛顿迭代法及其在现实生活中的应用.牛顿迭代法为平方收敛,故其收敛速度较快,但对初值的选取需要谨慎,如果初值选取错误,则可能导致方程迭代发散,最终不能求解出正确解.在计算一些对精度要求特别苛刻时,最好给出较高的精度输入及输出,防止因为精度问题导致误差过大,最终影响结果.牛顿迭代法可以应用于分形理论.分形理论是近二、三十年才发展起来的一门新的学科,其主要描述自然界和非线性系统中不光滑和不规则的几何形体.在地质、材料科学、物理学、计算机科学、艺术设计等方面有着十分广阔的应用前景. 利用牛顿迭代的数学原理和方法,实现牛顿迭代法的分形图形生成算法,将分形理论应用于计算机图形设计中,形.利用VC++6.0开发工具,实现了生成绚丽多彩的分形图[]3非线性方程的求根问题在计算机发展的基础上,被广泛应用于各种工程计算,大大方便了工程师们的计算过程,在现代的工业发展中发挥了重要作用.牛顿迭代法简便易学,为今后的学子们提供了更多的学习内容.参考文献[1] 胡良剑,孙晓君.Matlab数学实验[M]. 高等教育出版社,2006.[2] 李庆扬,王能超,易大义.数值分析(第4版)[M].清华大学出版社.施普林格出版社.2001.[3] 吴运兵,李勇.《西安科技大学学报》2005年03期.。
MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)
佛山科学技术学院实 验 报 告课程名称 数值分析实验项目 迭代法专业班级 机械工程 姓 名 余红杰 学 号 2111505010指导教师 陈剑 成 绩 日 期 月 日一. 实验目的1、 在计算机上用Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组 。
2、 在计算机上用二分法和Newton 迭代法求非线性方程 的根。
二. 实验要求1、按照题目要求完成实验内容;2、写出相应的Matlab 程序;3、给出实验结果(可以用表格展示实验结果);4、分析和讨论实验结果并提出可能的优化实验。
5、写出实验报告。
三. 实验步骤1、用Matlab 编写Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组Ax b =的程序。
2、用Matlab 编写二分法和Newton 法求非线性方程()0f x =的根程序。
3、设⎪⎪⎪⎭⎫ ⎝⎛--=212120203A ,T b )1,3,1(=,对于线性方程组b Ax =,考虑如下问题: (1)分别写出Jacobi 迭代矩阵和Gauss-Seidel 迭代矩阵(2)用Jacobi 迭代法和Gauss-Seidel 迭代法解该方程时,是否收敛?谁收敛的更快?(3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。
4、用调试好的二分法和Newton 迭代法程序解决如下问题求020sin 35=-+-x x e x 的根,其中控制精度810-=eps ,最大迭代次数50=M 。
四. 实验结果1.%Jacob.mfunction [x,B] = Jacob(A,b,n)%Jacobi迭代求解方程组Ax=b,系数矩阵A,迭代次数n%求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);J = D^(-1)*(L+U);B = J;f = D^(-1)*b;%初始化x即启动值:x = zeros(m,1);%根据x(k+1)=Jx(k)+f进行矩阵运算:for i=1:nx = J*x + f;end%GauSeid.mfunction [x,G] = GauSeid(A,b,n)%Gauss-Seidel迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);G = inv(D-L)*U;f = inv(D-L)*b;%初始化矩阵:%根据x(k+1)=Gx(k)+f进行矩阵运算:x = zeros(m,1);for i = 1:nx = G*x + f;end2.%Dichotomy.mfunction x=Dichotomy(x1,x2,p,n)%利用二分法求根,区间[x1,x2]%p为精度a = x1;b = x2;%进行n次二分:%第一个条件判断根在a,b区间内%第二个条件判断是否中间点就是根,是则迭代终止;%第三个条件判断二分后根在中点左侧还是右侧;%第四个条件判断精度是否达标,用区间长度代替for i=1:nif f(a)*f(b)<0x0 = (a+b)/2;p0 = (b-a)/(2^i);if f(x0)==0x = x0;elseif f(a)*f(x0)<0b = x0;else a= x0;endendendif p0>pcontinue;elsex = x0;break;endend%NewIterat.mfunction x=NewIterat(x0,p,n)%利用牛顿迭代法求根;%x0为启动点,估计的靠近根的值,p为精度,n为迭代次数;syms x1;%设置一个自变量x1,方便后面的求导:f1 = diff(f(x1));%进行n次迭代,精度达标会提前终止;%第一个判断是根据控制条件来确定真实误差是选绝对还是相对误差;%第二个判断是确定精度是否满足要求for i=1:nx1 = x0;x = x0-f(x0)/eval(f1);if x<1RealDiv = abs(x-x0);else RealDiv = abs(x-x0)/abs(x); endif RealDiv>px0 = x;else break;endend3.run43.mclc,clear;A = [3 0 -2;0 2 1;-2 1 2];b = [1;3;1];n1 = 50;n2 =100;%输入A,b矩阵,设置迭代次数为50次;%调用迭代函数,返回迭代矩阵;[x,B] = Jacob(A,b,n1);xj50 = x;f1 = max(abs(eig(B)))%显示谱半径,确定收敛性;[x,B] = GauSeid(A,b,n1);xg50 = x;f2 = max(abs(eig(B)))%谱半径;xj100 = Jacob(A,b,n2);xg100 = GauSeid(A,b,n2); Jacobi= [xj50,xj100]%对比迭代50次和100次的结果GauSei= [xg50,xg100]%很容易看出准确解为[1;1;1]4.f.mfunction y = f(x)%所有f(x)=0中f(x)函数;y = exp(5*x)-sin(x)+x^3-20; 下页是具体解时的程序:%run44.mclc,clear;%很容易看出在[0,1]间有解;x = Dichotomy(0,1,10^(-8),50)x = NewIterat(0,10^(-8),50)五. 讨论分析4.3实验中的迭代矩阵在上个部分,分别为J 和G ;对于收敛性,看下图中的f1,f2,也就是迭代矩阵的谱半径,都是小于1的,但是可以看出后者的谱半径更小,就是说它的收敛速度更快;最终求x 的值,每种迭代方法分别迭代50次(第一列)和100次(第二列); 实际值为[1;1;1]可以看出用高斯赛德尔迭代更精确,速度更快。
用牛顿法解非线性方程组
迭代五次的结果为:
x1 =
0.5000
-0.0000
-0.5236
非线性方程组的解为:
x0 =
0.5000
-0.0000
-0.5236
A=inv(dFx);
k=0;
%===============================
% Newon迭代法核心程序
while norm(Fx)>1e-10
x1=x0-A*Fx; % 核心迭代公式
k=k+1;
if k==5
disp('迭代五次的结果为:') ;
x1
elseif k>=100
disp('迭代次数过多,不收敛!');
用牛顿法解非线性方程组牛顿法解非线性方程组非线性方程组数值解法非线性方程组的解法非线性方程组迭代解法非线性方程组解法牛顿迭代法解方程组matlab解非线性方程组解非线性方程组fsolve解非线性方程组
四、(上机题)分别用Newton法和Broyden法求解下面非线性方程组
(要求:用Matlab编程,并附上源代码及迭代五次的结果,初值可取 )
f3=exp(-x*y)+20*z+1/3*(10*pi-3);
F=[f1;f2;f3];
%===============================
Fx = subs(F,{x,y,z},x0);
dF = Jacobian(F); % 求雅克比矩阵
dFx = subs(dF,{x,y,z},x0);
第四题:
Newton法:myNewton..m
function[t]=myNewton(x0) % x0为初始值向量
MATLAB实例:非线性方程数值解法(迭代解)
MATLAB实例:⾮线性⽅程数值解法(迭代解)MATLAB实例:⾮线性⽅程数值解法(迭代解)很久之前写过⼀篇关于“”,本博⽂相当于之前这⼀篇的延续与拓展,介绍四种求解⼀元⾮线性⽅程的数值解法(迭代解),包括:⽜顿迭代法,Halley迭代法,Householder迭代法以及预测校正⽜顿-哈雷迭代法(Predictor-Corrector Newton-Halley,PCNH),具体参考⽂献[1],来源于这篇⽂章:THREE-STEP ITERATIVE METHOD WITH EIGHTEENTH ORDER CONVERGENCE FOR SOLVING NONLINEAR EQUATIONS。
1. 迭代更新公式2. MATLAB程序newton.mfunction [x1, k]=newton(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);halley.mfunction [x1, k]=halley(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-(2*subs(fun,x,t0)*subs(diff(fun,'x'), x, t0))/(2*(subs(diff(fun,'x'), x, t0))^2-subs(fun, x, t0)*subs(diff(fun,'x',2),x,t0)); if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);householder.mfunction [x1, k]=householder(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-(subs(fun, x, t0))/(subs(diff(fun,'x'),x,t0))-(((subs(fun, x, t0))^2)*subs(diff(fun,'x',2),x,t0))/(2*(subs(diff(fun,'x',2),x,t0))^3); if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);PCNH.mfunction [x1, k]=PCNH(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;w=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);y=w-(2*subs(fun,x,w)*subs(diff(fun,'x'), x, w))/(2*(subs(diff(fun,'x'), x, w))^2-subs(fun, x, w)*subs(diff(fun,'x',2),x,w)); t1=y-(subs(fun, x, y))/(subs(diff(fun,'x'),x,y))-(((subs(fun, x, y))^2)*subs(diff(fun,'x',2),x,y))/(2*(subs(diff(fun,'x',2),x,y))^3);if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);demo.mclearclc% Input: 初始值,迭代终⽌条件,最⼤迭代次数[x1, k1]=newton(1,1e-4,20); % ⽜顿迭代法[x2, k2]=halley(1,1e-4,20); % Halley迭代法[x3, k3]=householder(1,1e-4,20); % Householder迭代法[x4, k4]=PCNH(1,1e-4,20); % 预测校正⽜顿-哈雷迭代法(PCNH)fprintf('⽜顿迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x1, k1);fprintf('Halley迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x2, k2);fprintf('Householder迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x3, k3);fprintf('预测校正⽜顿-哈雷迭代法(PCNH)求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x4, k4); %% 函数图像x=-5:0.01:5;y=x.^3+4.*(x.^2)-10;y_0=zeros(length(x));plot(x, y, 'r-', x, y_0, 'b-');xlabel('x');ylabel('f(x)');title('f(x)=x^3+4{x^2}-10');saveas(gcf,sprintf('函数图像.jpg'),'bmp'); %保存图⽚3. 数值结果求解$f(x)=x^3+4{x^2}-10=0$⽅程在$x_0=1$附近的根。
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。
MATLABNewton迭代法解非线性方程
MATLABNewton迭代法解非线性方程Newton 迭代法解非线性方程Newton 迭代法解非线性方程算法:Step 1 给定初值0x ,e 为根的容许误差Step 2 计算()()1'11----=n n n n x f x f x xStep 3 判断e x x <-0转到Step 4否则转到Step 2Step 4 迭代结果为n x x =Newton 迭代法解非线性方程程序:function Newton_diedai(fun,x0,e)%fun--原函数%dfun-导函数%x0---迭代初值%e----精度%k----迭代次数dfun=inline(diff('x^3-x^2-1'));%计算导函数x=x0;x0=x+1000*e;k=0;while abs(x0-x)>e&k<100%判断误差和迭代次数k=k+1;%计算迭代次数x0=x;x=x0-feval(fun,x0)/feval(dfun,x0);endif k==500disp('迭代次数过多,防止死循环终止');elsefprintf('迭代到%d 次时得到结果%f\n',k,x)end例:用Newton 迭代法求解非线性方程0123=--x x 在5.10=x 附近的根输入:clear allclcfun=inline('x^3-x^2-1')Newton_diedai(fun,1.5,0.5e-6)得到:迭代到4次时得到结果1.465571指导教师:***。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fun=diff(sym(f));%求导数
fa=subs(sym(f),findsym(sym(f)),a);
fb=subs(sym(f),findsym(sym(f)),b);
dfa=subs(sym(fun),findsym(sym(fun)),a);
dfb=subs(sym(fun),findsym(sym(fun)),b);
备注:数据格式说明
解:
(1)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:
fid=fopen('');
fori=1:18
tline=fgetl(fid);
end
phi1=1;phi=1;phi2=1;line=0;
f=zeros(19,19,19);
while~feof(fid)
tline=fgetl(fid);
data=str2num(tline);
line=line+1;
ifmod(line,20)==1
phi2=(data/5)+1;
phi=1;
else
forphi1=1:19
f(phi1,phi,phi2)=data(phi1);
end
phi=phi+1;
end
end
C=[c1+c2,-c2;-c2,c2];
%构成四阶参数矩阵
A=[zeros(2,2),eye(2);-M\K,-M\C];
%四元变量的初始条件
y0=[x0;xd0];
%设定计算点,作循环计算
for i=1:round(tf/dt)+1
t(i)=dt*(i-1);
y(:,i)=expm(A*t(i))*y0;%循环计算矩阵指数
班级:
学号:
姓名:
一、《LAB程序设计实践》Matlab基础
表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:
root为求出的函数零点。
,
牛顿法的matlab程序代码如下:
functionroot=NewtonRoot(f,a,b,eps)
%牛顿法求函数f在区间[a,b]上的一个零点
%函数名:f
%区间左端点:a
%区间右端点:b
%根的精度:eps
%求出的函数零点:root
if(nargin==3)
eps=;
end
初始值可以取 和 的较大者,这样可以加快收敛速度。
和牛顿法有关的还有简化牛顿法和牛顿下山法。
在MATLAB中编程实现的牛顿法的函数为:NewtonRoot。
功能:用牛顿法求函数在某个区间上的一个零点。
调用格式:root=NewtonRoot
其中, 为函数名;
为区间左端点;
为区间右端点
eps为根的精度;
end
%按两个分图绘制x1、x2曲线
subplot(2,1,1),plot(t,y(1,:)),grid
xlabel('t'),ylabel('y');
subplot(2,1,2),plot(t,y(2,:)),grid
xlabel('t'),ylabel('y');
运行M文件,依下图所示在MATLAB命令窗口中输入数据:
f1=subs(sym(f),findsym(sym(f)),a);
f2=subs(sym(f),findsym(sym(f)),b);
if(f1==0)
root=a;
end
if(f2==0)
root=b;
end
if(f1*f2>0)
disp('两端点函数值乘积大于0 !');
return;
else
二 《MATLAB程序设计实践》科学计算(24)
班级:
学号:
姓名:
1、编程实现以下科学计算算法,并举一例应用之。(参考书籍《精通MALAB科学计算》,王正林等著,电子工业出版社,2009年)
“牛顿法非线性方程求解”
解:弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为:
(2)将以下代码保存为文件:
fopen('');
readdata;
fori=1:19
subplot(5,4,i)
pcolor(f(:,:,i))
nd
运行结果如下图所示:
将以下代码保存为文件:
fopen('');
readdata;
fori=1:19
subplot(5,4,i)
contour(f(:,:,i))
即可得出该振动的两种模态
2)
解:第一步,在MATLAB命令窗口输入命令pdetool打开工具箱,调整x坐标范围为[04],y坐标范围为[03].通过options选项的Axes Linits设定如下图所示。
第二步,设定矩形区域。点击工具箱栏中的按钮“ ”,拖动鼠标画出一矩形,并双击该矩形,设定矩形大小,如下图所示。
中南大学
MATLAB程序设计实践
学长有爱奉献LE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。第一题需要把数据文本文档和m文件放在一起。全部测试无误,放心使用。本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。←记得删掉这段话
第三步,设边界条件。点击工具栏中的按钮“ ”,并双击矩形区域的相应的边线在弹出的对话框中设定边界条件。如下图所示,分别为各边框的边界条件。
第四步,设定方程。单击工具栏中的按钮“ ”,在PDE模式下选择方程类型,如下图所示,并在其中设定参数。
第五步,单击工具栏中的按钮“ ”,拆分区域为若干子区域,如下图所示。
(1)用Slice函数给出其整体分布特征;
(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);
(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。
k1=input('k1=');k2=input('k2='); %刚度
%输入阻尼系数
c1=input('c1=');c2=input('c2=');
%给出初始条件及时间向量
x0=[1;0];
xd0=[0;-1];
tf=50; %步数
dt=; %步长
%构成二阶参数矩阵
M=[m1,0;0,m2];
K=[k1+k2,-k2;-k2,k2];
(3)由上述的解耦模态中,给出初始条件 , ,化为 , ,即可求出其分量 , 。
设位置和速度的初始条件分别为 , ,则这三个步 骤得到的最后公式为
系统解耦的振动模态的MATLAB代码如下:
function erziyoudu()
%输入各原始参数
m1=input('m1=');m2=input('m2='); %质量
end
运行结果如下图所示:
(3)φ1=0~90,φ=45,φ2=0所对应的f(φ1,φ,φ2)即为f(:,10,1)。将以下代码保存为文件:
fopen('');
readdata;
plot([0:5:90],f(:,10,1),'-bo')
text(60,6,'\phi=45 \phi2=0')
运行结果如下图所示:
root=r1-fx/dfx;%迭代的核心公式
tol=abs(root-r1);
end
end
例:求方程3x^2-exp(x)=0的一根
解:在MATLAB命令窗口输入:
>> r=NewtonRoot('3*x^2-exp(x)',3,4)
输出结果:
X=
流程图:
2、编程解决以下科学计算问题。
1)
解:这个方程可用下列步骤来解
fclose(fid);
将以上代码保存为在MATLAB中运行,运行结果如下图所示:
将以下代码保存为文件:
fopen('');
readdata;
[x,y,z]=meshgrid(0:5:90,0:5:90,0:5:90);
slice(x,y,z,f,[45,90],[45,90],[0,45])
运行结果如下图所示:
if(dfa>dfb)%初始值取两端点导数较大者
root=a-fa/dfa;
else
root=b-fb/dfb;
end
while(tol>eps)
r1=root;
fx=subs(sym(f),findsym(sym(f)),r1);
dfx=subs(sym(fun),findsym(sym(fun)),r1);%求该点的导数值
(1)用eig函数求出矩阵K-λM的特征值L和特征向量U,U和L满足
(2)在原始方程Mx+Kx=0两端各乘以 及在中间乘以对角矩阵 *U,得
*M* *U* + *K* *x=0
作变量置换 ,得
这是一个对角矩阵方程,即可把它分两个方程: