matlab中方程根的近似计算要点

matlab中方程根的近似计算要点
matlab中方程根的近似计算要点

实验一方程根的近似计算

一、问题

求非线性方程的根

二、实验目的

1、学会使用matlab中内部函数roots、solve、fsolve、fzero求解方程,并用之解决实际问题。

4、熟悉Matlab的编程思路,尤其是函数式M文件的编写方法。

三、预备知识

方程求根是初等数学的重要内容之一,也是科学和工程中经常碰到的数值计算问题。它的一般形式是求方程f(x)=0的根。如果有x*使得f(x*)=0,则称x*为f(x)=0的根,或函数f(x)的零点。并非所有的方程都能求出精确解或解析解。理论上已经证明,用代数方法可以求出不超过3次的代数方程的解析解,但对于次数大于等于5的代数方程,没有代数求根方法,即它的根不能用方程系数的解析式表示。至于超越方程,通常很难求出其解析解。不存在解析解的方程就需要结合具体方程(函数)的性质,使用作图法或数值法求出近似解。而计算机的发展和普及又为这些方法提供了广阔的发展前景,使之成为科学和工程中最实用的方法之一。下面介绍几种常见的求近似根的方法。

1. 求方程近似解的简单方法

1.1 图形方法—放大法求根

图形的方法是分析方程根的性态最简洁的方法。不过,不要总是想得到根的精确值。这些值虽然粗糙但直观,多少个根,在何范围,一目了然。并且还可以借助图形局部放大功能,将根定位得更加准确一些。

例1.1 求方程x5+2x2+4=0的所有根及其大致分布范围。

(1)画出函数f(x)=x5+2x2+4的图形,确定方程的实数根的大致范围。为此,在matlab命令窗中输入

clf

ezplot x-x,

grid on

hold on

ezplot('x^5+2*x^2+4',[-2*pi,2*pi])

1-1 函数f(x)=x5+2x2+4的图形

clf

x=-2*pi:0.1:2*pi;

y1=zeros(size(x));

y2= x.^5+2*x.^2+4;

plot(x,y1,x,y2)

grid on

axis tight

title('x^5+2x^2+4')

xlabel('x')

从图1-1可见,它有一个实数根,大致分布在-2与2之间。

(2)将作图范围不断缩小,用放大法可得到精度越来越高的根的近似值。在matlab命令窗中先后键入

subplot(2,2,1)

ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-2,2])

subplot(2,2,2)

ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-2,-1])

subplot(2,2,3)

ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-1.6,-1.5])

subplot(2,2,4)

ezplot x-x, grid on, hold on, ezplot('x^5+2*x^2+4',[-1.55,-1.54])

图1-2 放大法求函数f(x)=x5+2x2+4的根

由图1-2可知,方程的根在-1.545与-1.54之间。

1.2 数值方法

非线性方程f(x)=0求根的方法有区间法和迭代法两大类,二分法、弦位法是区间法,简单迭代法和牛顿迭代法及其变形是迭代法,这里只给出二分法、简单迭代法和牛顿迭代法的构造过程。

(1)根的隔离与二分法

根的隔离思想来源于连续函数的零点定理:

若函数f(x)在闭区间[a,b]上连续,且f(a)f(b)<0,则方程f(x)=0在(a,b)内至少有一根x *。

二分法是最简单的求根方法,它是利用连续函数的零点定理,将含根区间逐次减半缩小,取区间的中点构造收敛点列{x n }来逼近根x *。

用该方法求f(x)=0的近似解可分两步做:

第一步,确定根的近似位置或大致范围,即确定一个区间[a,b],使所求根是位于这个区间内的唯一实根。这个区间称为根的隔离区间,这可以通过函数作图达到:先画出y=f(x)的图形,然后从图上定出它与x 轴交点的大概位置。

第二步,以根的隔离区间[a,b]的端点作为根的初始近似值,用二分法逐步改进根的近似值的精确度,直至求得满足精确度的近似解。具体步骤如下:

取[a,b]的中点x 0=(a+b)/2,若f(x 0)=0,则x 0就是f(x)=0的根x *。若f(a)f(x 0)<0,则根x *必在区间(a,x 0)内,取a 1=a, b 1=x 0;否则根x *必在区间(x 0,b)内,取a 1=x 0, b 1=b 。这样,得到新区间[a 1,b 1],其长度为[a,b]的一半。如此继续下去,进行n 等分后,得到一组不断缩小的区间序列[a,b], [a 1,b 1], [a 2,b 2],…, [a n ,b n ],…,和对应区间的中点数列x n =(a n +b n )/2, n=0,1,2,…, 其中每个区间都含有根x *,满足

[a,b]?[a 1,b 1] ?[a 2,b 2] ?…? [a n ,b n ] ?…

且每个区间的长度都是前一区间长度的一半。由于[a n ,b n ]的长度为(b-a)/2n ,当n 不断变大时,这些区间将收敛于一点x *,该点即为所求的根。

当做到第n 步时,有

1*11

22||()()

n n n n x x b a b a +-≤-=-

选择适当的步数n ,就可达到满意的精度。

用二分法,理论上区间中点序列{x n }将收敛到根的真值,但收敛速度较慢,所以通常用二分法为其他方法提供初步的近似值。

(2)简单迭代法

迭代法的基本原理是构造一个迭代公式,反复用它得出一个逐次逼近方程根的数列,数列中每一项都是方程根的近似值,只是精度不同。简单迭代法也成逐次迭代法,是非线性方程求根中各类迭代法的基础。

由于对方程作等价变换根不发生变换,将方程f(x)=0等价变换为

()x x ?=,构造迭代计算公式1()n n x x ?+=。取定初值x 0,算出数列{x n }。如果

{x n }收敛于x *,则有

**1lim lim ()(lim )()n n n n n n x x x x x ???+→∞

→∞

→∞

====

这说明,x *就是方程f(x)=0的根。上面()x x ?=称为不动点方程,()x ?称为迭代函数,数列{x n }称为迭代数列。

(3)牛顿迭代法

如果f(x)在[a,b]上具有二阶导数,f(a)f(b)<0,且f'(x)与f''(x)在[a,b]上保持同号,这时可采用牛顿迭代法求方程f(x)=0在(a,b)内的惟一实根。牛顿迭代法将非线性方程线性化处理为近似方程,然后用近似方程获得求根的迭代公式。具体做法如下:

设x n 是f(x)=0的一个近似根,把f(x)在x k 处作泰勒展开,得

f(x)=f(x k )+f'(x k )(x-x k )+(f''(x k )/2!)(x-x k )2+…

取前两项来近似代替f(x),则得近似线性方程

f(x)≈f(x k )+f'(x k )(x-x k )=0

如果f'(x k )≠0,令其解为x k+1,得

x k+1=x k-f(x k)/f'(x k), k=1,2,.. (1-1)上式称为f(x)=0的根的牛顿迭代格式。

牛顿法具有明显的几何意义,方程

y=f(x k)+f'(x k)(x-x k)

是曲线在点(x k, f(x k))处的切线方程。迭代方程(1.1)就是切线与x轴交点的横坐标,所以牛顿迭代法就是用切线与x轴交点的横坐标近似替代曲线与x轴交点的横坐标。因此牛顿法也称切线法,是非线性方程求根方法中收敛最快的方法。

2. matlab中方程求解的基本命令

roots(p):求多项式方程的根,其中p是多项式系数按降幂排列所形成的向量。solve(fun):求方程fun=0的符号解,如果不能求得精确的符号解,可以计算可变精度的数值解。

solve(fun,var):对指定变量var求代数方程fun=0的符号解。

fsolve(fun,x0):用最小二乘法求非线性方程fun=0在估计值x0附近的近似解。fzero(fun,x0):求函数fun在x0附近的零点。

四、实验过程

1、编写二分法求根程序,求方程x3+1.1x2+0.9x-1.4=0实根的近似值,使误差不超过10-3。

解:

(1)求根的初始隔离区间

在matlab工作区输入命令:

ezplot x-x, grid on, hold on, ezplot('x^3+1.1*x^2+0.9*x-1.4')

图1-4

画出曲线图1-4。

由上图可知,根应在-2和2之间,进一步画出该部分的图形。ezplot x-x, grid on, hold on, ezplot('x^3+1.1*x^2+0.9*x-1.4',[-2,2])

图1-5

由图1-5可见,根在0.5与1之间。

(2)编写程序如下:

f=input('输入函数:f(x)=');

qujian=input('输入区间=');

err=input('输入误差=');

a=qujian(1);

b=qujian(2);

yc=1;

while ((b-a)>err)&(yc~=0)

c=(a+b)/2;

x=a; ya=eval(f);

x=b; yb=eval(f);

x=c; yc=eval(f);

if ya*yc<0

b=c;

else

a=c;

end

x0=c

end

存为文件erfenfa.m

调用erfenfa得到如下结果:

>> erfenfa

输入函数:f(x)='x^3+1.1*x^2+0.9*x-1.4'

输入区间=[0,1]

输入误差=0.001

x0=0.5000

x0=0.6250

x0=0.6875

x0=0.6563

x0=0.6719

x0=0.6641

x0=0.6680

x0=0.6699

x0=0.6709

由此得到,方程的根的近似值为0.6709.

2、编写牛顿迭代法求根程序,求1中方程x3+1.1x2+0.9x-1.4=0的实根的近似值,并计算迭代次数为6的近似根。

解:

由1可知,[0.5,1]是根所在的区间,在[0.5,1]上

f(x)= x3+1.1x2+0.9x-1.4

f'(x)=3*x2+2.2x+0.9, f''(x)=6x+2.2

f'(x)与f''(x)在[0.5, 1]上保持同号,f(1)>0与f''(1)同号,所以取x0=1为迭代初始值。

用matlab语言编写一般的程序如下:

f=input('输入函数:f(x)=');

n=input('请输入迭代次数:n=');

x0=input('请输入迭代初始值:x0=');

f1=diff(f);

format long

for i=1:n

x=x0;

fx0=eval(f);

x0=x0-fx0/f1x0;

fprintf('x0=%12.10f\n',x0)

end

存为文件niudunfa.m,调用及运行结果如下:

>> niudunfa

输入函数:f(x)='x^3+1.1*x^2+0.9*x-1.4'

请输入迭代次数:n=6

请输入迭代初始值:x0=1

x0=0.7377049180

x0=0.6741688117

x0=0.6706675756

x0=0.6706573108

x0=0.6706573107

x0=0.6706573107

由此得到,方程的根的近似值为0.6706573107。

3. 用matlab中的内部函数求方程的根。

(1)用roots求方程x9+x8+1=0的根;

(2)用solve求上述方程的根;

(3)用fzero求方程x2+4sinx=25的实根;

(4)用fsolve求方程x=e-x在0附近的根;

解:

(1)在matlab命令窗口输入命令:

p=zeros(10,1);

p([1:2,end],1)=1;

roots(p)

ans =

-1.213149723059643

-0.901727735578254 + 0.575312094072893i

-0.901727735578254 - 0.575312094072893i

-0.269351937596575 + 0.940578401023146i

-0.269351937596575 - 0.940578401023146i

0.416834006536573 + 0.841919773084660i

0.416834006536573 - 0.841919773084660i

0.860820528168075 + 0.334352258897906i

0.860820528168075 - 0.334352258897906i

(2)在matlab命令窗口输入命令:

solve('x^9+x^8+1=0')

ans =

RootOf(X1^9 + X1^8 + 1, X1)

(3)首先作图确定根的大致范围:

clf, ezplot x-x, grid on, hold on, ezplot('x^2+4*sin(x)-25')

图1-6

由图1-6可确定两根在x1≈-4,x2≈5附近。再具体求根。x1=fzero('x^2+4*sin(x)-25',-4)

x2=fzero(' x^2+4*sin(x)-25',5)

x1 =

-4.586052690568049

x2 =

5.318580248846235

(4)在matlab命令窗口输入命令:

x=fsolve('x-exp(-x)',0)

Optimization terminated: first-order optimality is less than options.TolFun. x =

0.567143165036970

五、实验练习

1、用二分法求方程x3-1.2x+6=0的实根的近似值,使误差不超过10-3,并用roots命令进行检验。

2、用牛顿迭代法求方程x3-1.1x2+2x-8=0的实根的近似值,使误差不超过0.001,并用solve命令进行检验。

3、用简单迭代法求方程x=e-x在0附近的根,并用fsolve命令进行检验。

《应用计算方法教程》matlab作业二

6-1 试验目的计算特征值,实现算法 试验容:随机产生一个10阶整数矩阵,各数均在-5和5之间。 (1) 用MATLAB 函数“eig ”求矩阵全部特征值。 (2) 用幂法求A 的主特征值及对应的特征向量。 (3) 用基本QR 算法求全部特征值(可用MATLAB 函数“qr ”实现矩阵的QR 分解)。 原理 幂法:设矩阵A 的特征值为12n ||>||||λλλ≥???≥并设A 有完全的特征向量系12,,,n χχχ???(它们线性无关),则对任意一个非零向量0n V R ∈所构造的向量序列1k k V AV -=有11()lim ()k j k k j V V λ→∞ -=, 其中()k j V 表示向量的第j 个分量。 为避免逐次迭代向量k V 不为零的分量变得很大(1||1λ>时)或很小(1||1λ<时),将每一步的k V 按其模最大的元素进行归一化。具体过程如下: 选择初始向量0V ,令1max(),,,1k k k k k k k V m V U V AU k m +===≥,当k 充分大时1111,max()max() k k U V χλχ+≈ ≈。 QR 法求全部特征值: 111 11222 111 ,1,2,3,k k k k k A A Q R R Q A Q R k R Q A Q R +++==????==??=???? ??????==?? 由于此题的矩阵是10阶的,上述算法计算时间过长,考虑采用改进算法——移位加速。迭 代格式如下: 1 k k k k k k k k A q I Q R A R Q q I +-=?? =+? 计算k A 右下角的二阶矩阵() () 1,1 1,() (),1 ,k k n n n n k k n n n n a a a a ----?? ? ??? 的特征值()()1,k k n n λλ-,当()()1,k k n n λλ-为实数时,选k q 为()()1,k k n n λλ-中最接近(),k n n a 的。 程序

基于matlab的计算器制作

基于MATLAB的计算器制作从入门到高级 项目一、建立GUI框架 1,双击MATLAB图标(本实例使用的是MATLAB R2014),打开软件 2,打开GUI操作界面。有两种方式: a、在命令行窗口输入guide,然后点击回车。 b、先点击新建图标,在选择‘图形用户界面’。 得到如下窗口: 左上方有两个按钮:‘新建GUI’,‘打开现有GUI’。 对于‘新建GUI’:下方的选择框内有你可以选择建立的GUI类型,对于初学者一般选择第一个。下方是用来设置 保存文件位置的。

对于‘打开现有GUI’:初学者可能会在网上下载一些GUI源程序,使用‘打开现有GUI’,再浏览到文件所在位置便可。 3、构建GUI框架: 在选择新建GUI并且确定后,会弹出如下窗口: 在窗口的左边会有很多选项,可以一个个拖动编辑框内; 是不是发现这些选项发挥的作用刚好就是我们平常打开一个网页或者一个软件进行操作时的选择按钮。比较常见的有:按钮、单选按钮、拖动条、弹出式菜单等。看到这里细心地朋友就会发现,MATLAB GUI似乎可以开发出大型

软件哦,只要你有足够的想象力,当你从一个小白进阶到 一个高手之后,你可以做到的。 本次计算器制作只需要用到静态文本(或者是动态文本)用来做显示器,按钮(用来操作)。也可以添加一个面板 用来修饰。 在拖出的选项上双击,会得出该选项的属性栏,比如说 双击一个按钮选项,你会得到: 这个属性框比较复杂,没有必要一个个说清楚(有兴趣的 可以自己研究,其实理解起来也挺简单的) 本次计算器制作,我们只需要知道以下几个:

◆a、BackgroundColor取值为颜色的预定义字符或RGB 数值;缺省(就是默认的意思)值为浅灰色; ◆b、ForegroundColor取值为颜色的预定义字符或RGB 数值,该属性定义控件对象标题字符的颜色;缺省值为黑色; ◆c、String取值为字符串矩阵或块数组,定义控件对 象标题或选项内容; ◆d、FontName取值为控件标题等字体的字库名; ◆e、FontSize取值为数值,控制字体大小; ◆f、Tag取值为字符串,定义了控件的标识值,在任何 程序中都可以通过这个标识值控制该控件对象; ◆g、Style取值可以是pushbutton(缺省值), radiobutton, checkbox, edit, text, slider, frame, popupmenu 或listbox; 项目二、简单加法器的制作 1、框架准备

matlab解方程组

matlab解方程组 lnx表示成log(x) 而lgx表示成log10(x) 1-exp(((log(y))/x^0.5)/(x-1)) 1、解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB 中有两种方法: (1)x=inv(A)*b —采用求逆运算解方程组; (2)x=A\B —采用左除运算解方程组 PS:使用左除的运算效率要比求逆矩阵的效率高很多~ 例: x1+2x2=8 2x1+3x2=13 >>A=[1,2;2,3];b=[8;13]; >>x=inv(A)*b x = 2.00 3.00 >>x=A\B x = 2.00 3.00; 即二元一次方程组的解x1和x2分别是2和3。 对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下: 第一步:定义变量syms x y z ...; 第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN'); 第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。 如:解二(多)元二(高)次方程组: x^2+3*y+1=0 y^2+4*x+1=0 解法如下: >>syms x y; >>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0'); >>x=vpa(x,4); >>y=vpa(y,4); 结果是:

Matlab在物理上的应用举例

1. 单列波 %%单列波 t=0:0.001:10; A=input('振幅A='); w=input('频率w='); a=input('a='); y=A.*sin(w.*t+a); plot(t,y); pause(1),sound(y); ylabel('y'),xlabel('t') 2. %%光的单缝衍射现象 Lambda=500e-9; % a=input('a='); % 可取0.2e-3,1e-3,2e-3三种情况z=1 % ymax=3*Lambda*z/a; % Ny=51; % ys=linspace(-ymax,ymax,Ny); % NPoints=51; % yPoint=linspace(-a/2,a/2,NPoints); % for j=1:Ny % L=sqrt((ys(j)-yPoint).^2+z^2); % Phi=2*pi.*(L-z)./Lambda; % SumCos=sum(cos(Phi)); % SumSin=sum(sin(Phi)); % B(j)=(SumCos^2+SumSin^2)/NPoints^2; % end clf,plot(ys,B,'*',ys,B);grid; % 3. %%用毕奥-沙伐尔定律计算电流环产生的磁场 mu0=4*pi*1e-7; I0=5.0;Rh=1; C0=mu0/(4*pi)*I0; NGx=21;NGy=21; x=linspace(-Rh,Rh,NGx); y=linspace(-3,3,20);y=x; Nh=20; theta0=linspace(0,2*pi,Nh+1); theta1=theta0(1:Nh); y1=Rh*cos(theta1); z1=Rh*sin(theta1); theta2=theta0(2:Nh+1); y2=Rh*cos(theta2); z2=Rh*sin(theta2);

计算方法_全主元消去法_matlab程序

%求四阶线性方程组的MA TLAB程序 clear Ab=[0.001 2 1 5 1; 3 - 4 0.1 -2 2; 2 -1 2 0.01 3; 1.1 6 2.3 9 4];%增广矩阵 num=[1 2 3 4];%未知量x的对应序号 for i=1:3 A=abs(Ab(i:4,i:4));%系数矩阵取绝对值 [r,c]=find(A==max(A(:))); r=r+i-1;%最大值对应行号 c=c+i-1;%最大值对应列号 q=Ab(r,:),Ab(r,:)=Ab(i,:),Ab(i,:)=q;%行变换 w=Ab(:,c),Ab(:,c)=Ab(:,i),Ab(:,i)=w;%列变换 n=num(i),num(i)=num(c),num(c)=n;%列变换引起未知量x次序变化for j=i:3 Ab(j+1,:)=-Ab(j+1,i)*Ab(i,:)/Ab(i,i)+Ab(j+1,:);%消去过程 end end %最后得到系数矩阵为上三角矩阵 %回代算法求解上三角形方程组 x(4)=Ab(4,5)/Ab(4,4); x(3)=(Ab(3,5)-Ab(3,4)*x(4))/Ab(3,3); x(2)=(Ab(2,5)-Ab(2,3)*x(3)-Ab(2,4)*x(4))/Ab(2,2); x(1)=(Ab(1,5)-Ab(1,2)*x(2)-Ab(1,3)*x(3)-Ab(1,4)*x(4))/Ab(1,1); for s=1:4 fprintf('未知量x%g =%g\n',num(s),x(s)) end %验证如下 %A=[0.001 2 1 5 1; 3 -4 0.1 -2 2;2 -1 2 0.01 3; 1.1 6 2.3 9 4]; %b=[1 2 3 4]'; %x=A\b; %x1= 1.0308 %x2= 0.3144 %x3= 0.6267 %x4= -0.0513

基于matlab的计算器编程附代码

1.需求分析 本次的实验要求是设计一个计算器,主要功能如下: (1)实现基本数学运算(加减乘除等),而且要能进行混合运算 (2)实现部分函数功能,如求平方根、求倒数等 (3)能实现小数运算 界面与标准计算器界面类似 根据要求以及以前的学习情况,决定使用matlab进行编程。Matlab强大的计算功能以及便捷的GUI设计,可以较为简便的实现所要求的功能。按照要求,数据输入和输出支持小数点,支持四则混合运算,决定使用如下几个数据进行分析:(1+3)*5 Sqrt(4) 1/2 Sin4 用以检验是否可以进行加减乘除四则运算、平方根、倒数、正弦的运算。 2.程序设计 M atlab的程序设计较为简便,用GUI设计出一个计算器的模型,然后系统会自动生成一个框架,在框架中,写入每一个按键对应的程序就可以实现功能。 3.调式分析 编程的过程中遇到的问题不是很多,基本就是找要实现各个功能的子程序,通过上网和去图书馆,加上自己的编写,终于实现了实验要求的功能。但是有一点很重要,matlab不支持中文,所以从路径到文件名必须是全英文的,不然就无法识别。此外,给每个按键命名也是很重要的,不然在生成的程序框架里面,就无法识别各个按键的作用,编写程序的时候也就无法做到一一对应。 4.使用说明 程序的使用比较简单,由于是可视化界面,直接打开matlab,然后建立一个GUI 工程,再打开生成的fig文件,就是一个计算器的界面,直接按照市面上卖的计算器的

方法,按键使用即可。 5.测试结果 计算结果为20 4sqrt=2 Sin4结果为 1/2=0.5 经过计算,这些结果均与实际结果相吻合,计算器的功能实现的较为完好。 6.心得体会 本次试验由于不限制语言,于是计算功能强大,操作简便的matlab变成了首选,matlab的GUI设计,操作是较为简单的,首先建立一个GUI工程,然后用可视化界面,

基于MATLAB的图像处理的基本运算

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目: 基于MATLAB的图像处理的基本运算 初始条件: 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)能够对图像亮度和对比度变化调整,并比较结果 (2)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的和旋转操作,并保存,比较几 种插值的效果 (3)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。 (4)对图像加入各种噪声,比较效果。 时间安排: 指导教师签名:年月日 系主任(或责任教师)签名:年月日 目录 摘要.......................................................................................................................... 错误!未定义书签。 1 MATLAB简介 ........................................................................................................ 错误!未定义书签。2图像选择及变换................................................................................................... 错误!未定义书签。 2.1 原始图像选择读取....................................................................................... 错误!未定义书签。 2.1.1 原理图的读入与基本变换 .................................................................... 错误!未定义书签。

应用MATLAB求解经典物理若干典型问题_本科生毕业论文

应用MATLAB求解经典物理若干典型问题 大学本科生毕业论文 应用MATLAB求解经典物理若干典型问题The application of MATLAB in solving some classical physics questions

摘要 MATLAB是 MathWorks公司推出的一套科学计算软件,MATLAB的意思是矩阵实验室。MATLAB具有起点低、功能强大、易学易用以及兼有数值运算和符号运算功能的优点。利用MATLAB,绘图十分方便,它既可以绘制各种图形,包括二维图形和三维图形,还可以对图形进行修饰和控制。本文通过在MATLAB环境下编写通过科学计算解决经典物理问题,如力学、热学、电磁学中的一些常见问题。本文的思路主要是,先介绍经典物理习题,然后对习题进行分析,解答,再通过MATLAB 软件进行编程,模拟实验结果。通过多次验证。得到所需答案。再通过图形绘制,形象的描绘出图形,与预期结果进行比较、验证。作出总结。本文展示的MATLAB 软件在解决物理问题中的应用。 关键词:力学;热学;电磁学;MATLAB程序

ABSTRACT .MathWorks MATLAB is introduced in a scientific computing software, MATLAB means Matrix Laboratory . MATLAB has a low starting point, powerful, easy to use, and both numerical calculation and symbolic operation advantages. Using MATLAB, the drawing is very convenient, both to draw various graphics, including the two-dimensional graphics and three-dimensional graphics, graphics can also be modified and controlled. This article written by the MATLAB environment to solve by classical physics scientific computing problems, such as mechanical, thermal, electromagnetics some common problems. The main idea of this paper is to introduce classical physics problems, and then exercises to analyze, answer, and then programmed by MATLAB software to simulate the experimental results. Through multiple authentication. Get the answers you need. And through graphics rendering, the image depicts the graphics, compared with the expected results to verify. Conclusion. This article presents the MATLAB software to solve the problem of physics. Key Words:Mechanics;heat;electromagnetism,;MATLAB

基于MATLAB科学计算器

目录 计算器的效果图 ..................................... 错误!未定义书签。 一、GUI设计界面: (3) 1.打开GUI (3) 2.添加按钮 (3) 3.根据按钮的作用及视觉效果做一定的修改: (4) 4.保存、添加功能函数 (4) (1)数字键编写 (4) (2)符号键的编写 (4) (3)运算符“=”的编写 (5) (4)按键“←back”的编写 (5) (5)按键“清空”的编写 (5) (6)按键“退出”的编写 (5) (7)按键“二进制数转十进制数”的编写 (5) (8)按键“十进制数转二进制数”的编写 (5) 二、计算器的使用 (6) 除法运算(÷) (6) 平方运算(^2) (6) 函数cos (∏/3)的计算 (7) 函数arctan (∏/3)的计算 (7) 以2为底的对数的计算(log 2) (8) 十进制数转二进制数的计算(调用dec2bin函数) (8) 二进制数转十进制数的计算(调用bin2dec函数) (8) 三、附各按键的程序源代码 (9) 四、问题和解决方法 (15) 五、心得体会 (15) 参考文献 (15)

计算器的效果图:

一、GUI设计界面: 1.打开GUI 输入Guide 回车或者在工具栏上点击图标打开Guide 窗口: 2.添加按钮

3.根据按钮的作用及视觉效果做一定的修改: 双击按钮(Puch Button)进入按键属性修改显示字符串大小、字体和颜色,然后对按钮的位置进行排布,尽量使按钮集中在静态文本框下面。 4.保存、添加功能函数 把做好的按钮及静态文本框保存后自动弹出Editor的M文本,对然后对相应的pushbutton添加功能函数。以下是相应按钮的功能函数。 (1)数字键编写 在function pushbutton1_Callback(hObject, eventdata, handles)下输入:textString = get(handles.text1,'String'); textString =strcat(textString,'0'); set(handles.text1,'String',textString) 这是使用句柄handles指向对象text1,并以字符串形式来存储数据文本框text1的容,并存储数个“0”, 然后由set(handles.text1,'String','textString'在text1中输出。 同理,分别在function pushbutton2~10_Callback(hObject, eventdata, handles)下给1~9数字按键下编写此类程序。 (2)符号键的编写 function pushbutton12_Callback(hObject, eventdata, handles) textString = get(handles.text1,'String'); textString =strcat(textString,'÷'); set(handles.text1,'String',textString) strcat的作用是将两个字符串连接起来,就是在已输入的存储数据textString 后添加“÷”进行运算。 然后执行set(handles.text1,'String',textString)。符号键‘-’、‘*’、‘/’与‘÷’的运算函数类似。“平方运算”,主要是由“^2”功能实现。

第七讲 MATLAB中求方程的近似根(解)

第七讲MATLAB中求方程的近似根(解) 教学目的:学习matlab中求根命令,了解代数方程求根求解的四种方法,即图解法、准解析法、数值方法以及迭代方法,掌握对分法、迭代法、牛顿切法线求方程近似根的基本过程;掌握求代数方程(组)的解的求解命令. 教学重点:求方程近似解的几种迭代方法,代数方程(组)的解的求解命令的使用方法.利用所学的编程知识,结合具体的实例,编制程序进行近似求根.掌握相关的代数方程(组)的求解命令及使用技巧. 教学难点:方程的近似求解和非线性方程(组)的求解. 一、问题背景和实验目的 求代数方程0 x f的根是最常见的数学问题之一(这里称为代数方程,主要是想和 (= ) 后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当) f为线性方程,否则称之为非线性方程.(x (= x ) f是一次多项式时,称0 当0 (x f的多样性,尚无一般的解析解法可使用,但如f是非线性方程时,由于) ) x (= 果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.同时对于多未知量非线性方程(组)而言,简单的迭代法也是可以做出来的,但在这里我们介绍相关的命令来求解,不用迭代方法求解. 通过本实验,达到下面目的: 1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程; 2. 求代数方程(组)的解. 首先,我们先介绍几种近似求根有关的方法: 1.对分法 对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根. 设) a f ?b f,即()0 f a>,()0 f a<,()0 f b<或()0 f b>.则 ) , (< (x [b f在] a上连续,0 ( ) 根据连续函数的介值定理,在) fξ=. a内至少存在一点ξ,使()0 , (b 下面的方法可以求出该根:

MATLAB在物理中的应用(单摆).doc

<>课程论文 MATLAB在单摆实验中的应用 姓名蔡小强 学号:2010110102 专业:物理学 班级:10物理学 学院:物电学院 完成日期:2011/12/11

MATLAB在单摆实验中的应用 【摘要】借助MATLAB 计算软件, 研究无阻尼状态下单摆的大摆角运动, 给出了任意摆角下单摆运动周期的精确解。同时利用MATLAB 函数库中的ode45 函数, 求解出大摆角下的单摆的运动方程。并利用其仿真动画形象的展现出单摆的运动规律, 为单摆实验中大摆角问题的讲解提供了较好的教学辅助手段。 【关键字】单摆模型;周期;MATLAB 一、问题的提出 在工科物理教学中,物理实验极其重要,它担负着训练学生基本实验技能、验证学生所学知识、提高学生综合实力的重要职责。通过一系列的物理实验,学生可在一定程度上了解并掌握前人对一些典型物理量的经典测量方法和实验技术,并为以后的实验工作提供有价值的借鉴,进而培养学生的动手实践能力和综合创新能力。然而,物理实验的优劣很大程度受限于物理实验条件的制约。当前,受限于以下条件(很多情况下物理实验环境都是难以有效构造的),物理实验的效果并不理想:1)一些实验设备比较复杂并且昂贵,难以普及应用;2)有效实验环要求非常苛刻,是现实环境中难以模拟,甚至根本无法模拟;3)除此以外,有些实验的实验环境即使可以有效构造,它的实验结果却仍然是难以直接、完整观察获取的,如力场、电场、磁场中的分布问题等。鉴于以上原因,物理仿真实验已引起了大家的关注,出现了一些软件。但很多是基于Flash、Photoshop 、3D Studio MAX之类的图形图像软件制作。这些软件可以制作逼真的实验环境和生动的实验过程动画,还可以制作出实际实验所无法达到的效果。但这类软件本身是制作卡通动画的,对物理实验规律和过程很少涉及,很难做到真正的交互使用,及精确的计算分析同时开发也很困难。因此,基于这些软件的仿真在工科物理实验教学中应用很少。本文利用MATLAB 计算软件及其仿真功能对单摆实验过程进行模拟、仿真及后期分析,对物理实验教学改革提供一种新思路。 具体地,本文将描述一种新颖的单摆实验方法, 其主要的意义在于给学生以综合性实验技能训练。一个综合性实验, 它必须涉及多方面的知识和实验技能。本文描述的单摆实验方法即具备这样的特征。它的实验原理虽然简单, 但所涉及到的知识点极为丰富: 力学振动, 计算机编程等。学生通过这样的实验不仅可以得到综合性的实验技能训练, 而且可以在如何将现代技术改造传统实验、理论联系实际等方面得到很多启示。另外,本文引入计算机技术分析法, 对单摆实验进行了改造, 既实现了基础物理实验的现代化, 又为MATLAB课程实验提供了很好的应用落足点, 可以使学生得到多方面的实验技能训练。 二、方法概述 2.1问题描述 单摆问题是高中物理及大学普通物理实验教学中的一个基础问题。单摆在摆角比较小时,其运动规律近似为准简谐振动。但是当摆角比较大时, 即单摆在大摆角情况下运动时,这种近似已不再成立,其运动方程满足非线性微分方程。因此,对摆角大小的限制成为该实验中必须满足的条件。不同的实验条件下,最大摆角的取值不同,其中包括, ,,,甚至等。这就为在实验过程中对摆角的统一取值造成困难,给实验带来较大的误差。同时,学生对单摆在大摆角情况下运动时其运动周期及运动规律的理解也存在困难。利用先进的计算机仿真

matlab在计算物理中的应用

Matlab画图 单摆的动画化 clear clf plot([-0.2;0.2],[0;0],'y-', 'linewidth',10); hold on g=0.98; l=1; a0=pi/8 axis([-0.75,0.75,-1.25,0]); t=0; dt=0.1; m=moviein(1000); for i=1:1000 t=t+dt; a=a0*cos(sqrt(g/l)*t); x=sin(a); y=(-1)*cos(a); h(1)=plot(x,y,'r.','markersize',30); h(2)=plot([0;x],[0;y],'b-'); m(i)=getframe; delete(h);

end movie(m,2) 多边形 clear clf for n=3:11; t=linspace(0,2*pi,n+1); x=sin(t+pi/n+pi); y=cos(t+pi/n+pi); subplot(3,3,n-2); fill(x,y,'g') title(['正',num2str(n),'边形']); axis square; hold on; end 利萨如图形 >> t=0:pi/1000:2*pi; a=[0 4/pi 2/pi pi 0 4/pi 2/pi pi]; y=sin(t);

subplot(2,4,i) if i<5 n=1; x=cos(n*t+a(i)); plot(x,y) title(['n=1,a=',num2str(a(i))]) else n=2; x=cos(n*t+a(i)); plot(x,y) title(['n=2,a=',num2str(a(i))]) end end 线性方程组求解 clear a=input('please input a') b=input('please input b') [m,n]=size(a) B=[a b'] R1=rank(a)

(整理)matlab16常用计算方法.

常用计算方法 1.超越方程的求解 一超越方程为 x (2ln x – 3) -100 = 0 求超越方程的解。 [算法]方法一:用迭代算法。将方程改为 01002ln()3 x x =- 其中x 0是一个初始值,由此计算终值x 。取最大误差为e = 10-4,当| x - x 0| > e 时,就用x 的值换成x 0的值,重新进行计算;否则| x - x 0| < e 为止。 [程序]P1_1abs.m 如下。 %超越方程的迭代算法 clear %清除变量 x0=30; %初始值 xx=[]; %空向量 while 1 %无限循环 x=100/(2*log(x0)-3); %迭代运算 xx=[xx,x]; %连接结果 if length(xx)>1000,break ,end %如果项数太多则退出循环(暗示发散) if abs(x0-x)<1e-4,break ,end %当精度足够高时退出循环 x0=x; %替换初值 end %结束循环 figure %创建图形窗口 plot(xx,'.-','LineWidth',2,'MarkerSize',12)%画迭代线'.-'表示每个点用.来表示,再用线连接 grid on %加网格 fs=16; %字体大小 title('超越方程的迭代折线','fontsize',fs)%标题 xlabel('\itn','fontsize',fs) %x 标签 ylabel('\itx','fontsize',fs) %y 标签 text(length(xx),xx(end),num2str(xx(end)),'fontsize',fs)%显示结果 [图示]用下标作为自变量画迭代的折线。如P0_20_1图所示,当最大误差为10-4时,需要迭代19次才能达到精度,超越方程的解为27.539。 [算法]方法二:用求零函数和求解函数。将方程改为函数 100()2ln()3f x x x =-- MATLAB 求零函数为fzero ,fzero 函数的格式之一是 x = fzero(f,x0) 其中,f 表示求解的函数文件,x0是估计值。fzero 函数的格式之二是 x = fzero(f,[x1,x2])

基于Matlab的简易计算器

工程设计报告 设计题目:基于Matlab的简易计算器 学院: 专业: 班级: 学号: 姓名: 电子邮件: 日期:2015年12 月 成绩: 指导教师:

西安电子科技大学 电子工程学院 工 程设计 任务书 学生姓名指导教师职称 学生学号专业 题目基于Matlab 的简易计算器 任务与要求 任务如下: 利用MATLAB GUI 设计实现一个图形用户界面的计算器程序,实现: A.实现十进制数的加、减、乘、除、简单计算。 B. 科学计算函数,包括正弦、余弦、正切、余切、开方、指数等函数运行。 C. 有清除键,能清除操作。 要求如下: A .熟练掌握MatlabGUI 界面的设计与应用 B .最终计算器能够实现预期的相关功能 开始日期2015年 11月日完成日期2016年1月日 课程设计所在单位 本表格由电子工程学院网络信息中心编辑录入 https://www.360docs.net/doc/311088951.html,. …………………………装…………………… … … … … 订 … … … … … … … … … … … …线 … …… …… …… …… …… … …… …… …… …… …… … …

摘要 基于Matlab GUI计算器设计时利用GUI的创建图像用户界面进行计算器设计。设计计算器时,主要是考虑到计算器的易用性、功能的常用程度进行计算器界面与功能的设计。通过调整控件和文本的布局及颜色,使界面简单大方、布局合理,达到界面友好的效果。 计算器设计时主要利用到get和set两个函数进行各个控件属性值的传递和设置。计算器实现的功能有:数字0~9和小数点的输入显示,平方开方和对数的输入显示。进行四则运算、正弦函数、余弦函数、正切函数以及反正弦函数、反余弦函数、反正切函数的计算等等。最后运行调试,实现基于MatlabGUI的计算器的设计。 关键词:MatlabGUI计算器 Abstracts Based on Matlab GUI calculator design using the user interface to create images of GUI calculator design.Design calculator, mainly considering the ease of use, function calculators calculator interface and function of the common level of design.By adjusting the control and the layout of the text and color, make the interface simple and easy, rational layout, to achieve the effect of friendly interface. Calculator design used to get and set two main function for each attribute value transfer and control Settings.Calculator the functions are: 0 ~ 9, according to input and decimal square root and logarithm of input.Arithmetic, sine function and cosine function, tangent function and the arcsine function,arccosine function, the calculation of the arctangent function and so on.Finally running debugging, implementation design based on Matlab GUI calculator. Keywords: Matlab GUI calculator

matlab上机实践二(计算物理班)

实验二MATLAB程序设计 实验要求: 为达到理想的实验效果,同学们务必做到: (1)实验前认真准备,要根据实验目的和实验内容,复习好实验中可能要用 到的命令,想好编程的思路,做到胸有成竹,提高上机效率。 (2)实验过程中积极思考,要深入分析命令、程序的执行结果以及各种屏幕 信息的含义、出现的原因并提出解决办法。 (3)实验后认真总结,要总结本次实验有哪些收获,还存在哪些问题,并写 出实验报告。实验报告应包括实验目的、实验内容、流程图(较大程序)、程序(命令)清单、运行结果以及实验的收获与体会等内容。 同学们在上机过程中会碰到各种各样的问题,分析问题和解决问题的过程就是积累经验的过程。只要同学们按照上面3点要求去做,在学完本课程后就一定会有很大的收获。 实验仪器:计算机 实验时间:2018.4 实验原理: 1.M文件 命令文件;函数文件 命令文件直接运行,函数文件必须调用(不能直接运行)。2.matlab程序控制结构 (1)顺序结构 (2)选择结构:if语句;switch语句;try语句 (3)循环结构:for语句;while语句;循环嵌套 3.函数文件:function语句 4.函数调用:输出参数=函数名(输入参数)or函数名(输入参数)实验目的: 1.掌握建立和执行M文件的方法 2.掌握matlab的程序控制结构及其应用

3. 掌握matlab 函数文件和程序调试 实验内容: 1.建立M 文件,文件名自己选取,编写程序,建立向量G=[1,2,3,4,5];H=[5,4,3,2,1];利用向量G 、H 以及运算符产生下列向量。(要求只写出M 文件程序) a= 1 8 27 64 125 b= 0 0 1 0 0 c= 0 0 0 1 1 d= 1 1 1 0 0 2. 求分段函数的值。 32,13x 70,6980,652363≠?? ???--+≠<≤+--≠<-+=x x x x x x x x x x x y 及其它且且 建立M 文件(函数文件),用if 语句实现。调用函数,求出x=-5;-8;1;0时的 y 值。 3.已知f ()12233 4...(1)n n n =?+?+?++?+;1111g()...2222222n n = ++++???; 求(8)/(4)(4)(8) f g y f g =?。要求:建立两个函数文件(M 文件),函数名取为fff ,ggg ,编写程序分别用于求f (n ),g(n)(其中用for 循环求f (n ),g(n));调用这两个函数,计算y 。 4. 已知123d()...233445(1)(2)n n n n =++++???+?+,111y()3521 n n =++++; 建立两个M 文件(函数文件,分别用来求d(n)和y(n),用for 循环求和,文件名自由选取,可取fff3,ggg3),再建立一个函数文件(文件名选取kkk ),完成下列功能:当d(n)大于y(n)时,z=d(n)+y(n),当d(n)小于或等于y(n)时,z=d(n)/y(n),最后调用kkk 函数求出当n=3和10时的z 值。

matlab用于计算方法的源程序

1、Newdon迭代法求解非线性方程 function [x k t]=NewdonToEquation(f,df,x0,eps) %牛顿迭代法解线性方程 %[x k t]=NewdonToEquation(f,df,x0,eps) %x:近似解 %k:迭代次数 %t:运算时间 %f:原函数,定义为内联函数 ?:函数的倒数,定义为内联函数 %x0:初始值 %eps:误差限 % %应用举例: %f=inline('x^3+4*x^2-10'); ?=inline('3*x^2+8*x'); %x=NewdonToEquation(f,df,1,0.5e-6) %[x k]=NewdonToEquation(f,df,1,0.5e-6) %[x k t]=NewdonToEquation(f,df,1,0.5e-6) %函数的最后一个参数也可以不写。默认情况下,eps=0.5e-6 %[x k t]=NewdonToEquation(f,df,1) if nargin==3 eps="0".5e-6; end tic; k=0; while 1 x="x0-f"(x0)./df(x0); k="k"+1; if abs(x-x0) < eps || k >30 break; end x0=x; end t=toc; if k >= 30 disp('迭代次数太多。'); x="0"; t="0"; end

2、Newdon迭代法求解非线性方程组 function y="NewdonF"(x) %牛顿迭代法解非线性方程组的测试函数 %定义是必须定义为列向量 y(1,1)=x(1).^2-10*x(1)+x(2).^2+8; y(2,1)=x(1).*x(2).^2+x(1)-10*x(2)+8; return; function y="NewdonDF"(x) %牛顿迭代法解非线性方程组的测试函数的导数 y(1,1)=2*x(1)-10; y(1,2)=2*x(2); y(2,1)=x(2).^+1; y(2,2)=2*x(1).*x(2)-10; return; 以上两个函数仅供下面程序的测试 function [x k t]=NewdonToEquations(f,df,x0,eps) %牛顿迭代法解非线性方程组 %[x k t]=NewdonToEquations(f,df,x0,eps) %x:近似解 %k:迭代次数 %t:运算时间 %f:方程组(事先定义) ?:方程组的导数(事先定义) %x0:初始值 %eps:误差限 % %说明:由于虚参f和df的类型都是函数,使用前需要事先在当前目录下采用函数M文件定义% 另外在使用此函数求解非线性方程组时,需要在函数名前加符号“@”,如下所示 % %应用举例: %x0=[0,0];eps=0.5e-6; %x=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %[x k]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %[x k t]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %函数的最后一个参数也可以不写。默认情况下,eps=0.5e-6 %[x k t]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps)

MATLAB 微分代数方程解法Microsoft Word 文档

微分代数方程(DAE)的Matlab解法 所谓微分代数方程,是指在微分方程中,某些变量满足某些代数方程的约束。假设微分方程的更一般形式 可以写成 前面所介绍的ODEs数值解法主要针对能够转换为一阶常微分方程组的类型,故DAE就无法使用前面介绍的常微分方程解法直接求解,必须借助DAE的特殊解法。 其实对于我们使用Matlab求解DAE时,却没有太大的改变只需增加一个Mass参数即可。描述f(t,x)的方 法和普通微分方程完全一致。 注意:ode15i没法设置Mass属性,换句话说除了ode15i外其他ode计算器都可以求解DAEs问题1.当M(t,y)非奇异的时候,我们可以将微分方程等效的转换为y'=inv(M)*f(t,y),此时就是一个普通的ODE(当 然我们可以将它当成DAEs处理),对任意一个给定的初值条件都有唯一的解 2.当m(t,y)奇异时,我们叫它为DAEs(微分代数方程),DAEs问题只有在同时提供状态变量初值y0和状态变量一阶导数初值py0,且满足M(t0,y0)*yp0=f(t0,y0)时才有唯一解,假如不满足上面的方程,DAEs解算器会将提供的y0和py0作为猜测初始值,并重新计算与提供初值最近的封闭初值 3.质量矩阵可是一个常数矩阵(稀疏矩阵),也可以是一个自定义函数的输出。但是ode23s只能求解Mass 是常数的DAEs 4.对于Mass奇异的DAEs问题,特别是设置MassSingular为yes时,只能ode15s和ode23t解算器 5.对于DAE我们还有几个参数需要介绍 a.Mass:质量矩阵,不说了,这个是DAE的关键,后面看例子就明白了 b.MStateDependence:质量矩阵M(t,y)是否是y的函数,可以选择none|{weak}|strong,none表示M与 y无关,weak和strong都表示与y相关 c.MvPattern:注意这个必须是稀疏矩阵,S(i,j)=1表示M(t,y)的第i行中任意元素都与第j个状态变量yi有 关,否则为0 d.MassSingular:设置Mass矩阵是否奇异,当设置为yes时,只能使用ode15s和ode23t e.InitialSlope:状态变量的一阶导数初值yp0,和y0具有相同的size,当使用ode15s和ode23t时,该属 性默认为0 下面我们以实例说明,看下面的例子,求解该方程的数值解 【解】 真是万幸,选取状态变量和求状态变量的一阶导数等,微分方程转换工作,题目已经帮我们完成。 可是细心的网友会发现,最后一个方程不是微分方程而是一个代数方程(这就是为什叫DAE的原因),其实 我们可以将它视为对三个状态变量的约束。 (1)用矩阵形式表示出该DAEs

相关文档
最新文档