元旦放假4天,好好学习学习这本书,也算给自己的将来加个筹码吧。
这本书作者似乎多了点,Brian R.Hunt,Ronald L.Lipsman,Jonathan M.Rosenberg,with Kevin R.Coombes,John E.Osborn,and Garret J.Stuck,看着这么多,似乎想起了中国人出书的习俗:编、编著与著的差别,希望我挑的这本不会是编或者编著吧,要不实在是有点郁闷了,寄希望与Cambridge University Press吧,希望他们出的书都比较有水平!
一、Getting Started
第一章的内容似乎有点无聊,大概包括:平台和软件版本、安装与启动、如何运行和输入命令、使用帮助、如何退出。不过有一句话我很喜欢:We know you are anxious to get started using MATLAB,so we will keep this chapter chief.国外人写书的确和国内风格不同,很有种以人为本的意思。
二、Matlab基础
2.1 输入输出
>> 1/2 + 1/3
ans =
0.8333
>> ezplot('x^3-x')
输出[-6,6]的x^3-x的图像,效果很不错,但是需要注意,只能使用单引号,双引号会报错。
2.2 算术
如上所示,可以使用matlab来做算术运算,加减乘除分别使用+-*/来计算,这和我们小学所学的内容对应,呵呵,还是很简单的了。
>> 3^2 - (5 + 4)/2 + 6*3
ans =
22.5000
对于matlab而言,运算符周围使用空格是一种风格,可以使得你的代码更加清晰易懂,这不是强制的。返回值默认为4位小数,默认的返回值被赋值给变量ans,你当然可以对ans变量进行运算
>> ans^2 + sqrt(ans)
ans =
510.9934
如果你想给变量另外赋值,也很简单直观
>> u=cos(10)
u =
-0.8391
如果你希望给出更多的小数位,可以如下来做
>> format long
>> cos(10)
ans =
-0.83907152907645
类似的,format short可以变回原来的状态。
2.3 代数
>> syms x y
>> (x-y)*(x+y)
ans =
(x-y)*(x+y)
>> expand(ans)
ans =
x^2-y^2
>> factor(ans)
ans =
(x-y)*(x+y)
上面的expand表示公式展开,factor表示分解因式
>> simplify((x^3-y^3)/(x-y))
ans =
x^2+x*y+y^2
>> simplify((x^3+y^3)/(x+y))
ans =
x^2-x*y+y^2
>> simplify((x^5-y^5)/(x-y))
ans =
x^4+y*x^3+y^2*x^2+y^3*x+y^4
simplify表示公式化简
2.4 符号表达式的计算
>> cos(pi/2)
ans =
6.1232e-017
>> cos(sym('pi/2'))
ans =
0
上面可以看出,MATLAB在计算时是以浮点数进行的,因此对于pi/2的值通过正常的计算方式不会给出结果0,要获得正确的结果就需要将它转化为符号计算。
>> sym('1/2')+sym('1/3')
ans =
5/6
这个结果也比较有趣。
如何设定结果的精度呢?
>> vpa(pi,100)
ans =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
即计算pi的后面99位
当然我很BT的算了pi的后面10万位,结果放在这里了http://liuxin-blog.appspot.com/files/pi.html
2.5 解方程
>> solve('x^5-1=0')
ans =
[ 1]
[ 1/4*5^(1/2)-1/4+1/4*i*2^(1/2)*(5+5^(1/2))^(1/2)]
[ -1/4*5^(1/2)-1/4+1/4*i*2^(1/2)*(5-5^(1/2))^(1/2)]
[ -1/4*5^(1/2)-1/4-1/4*i*2^(1/2)*(5-5^(1/2))^(1/2)]
[ 1/4*5^(1/2)-1/4-1/4*i*2^(1/2)*(5+5^(1/2))^(1/2)]
>> solve('x^5+4*x-3=0')
ans =
[ -1.1497018561916804173894195017101-1.0229129378579045309241618357603*i]
[ -1.1497018561916804173894195017101+1.0229129378579045309241618357603*i]
[ .70611491577418302526709165976282]
[ .79664439830458890475587367182865-1.0767566643318152363781938845220*i]
[ .79664439830458890475587367182865+1.0767566643318152363781938845220*i]
很easy的了,不过就是不知道MATLAB是怎么算的,应该来说,这个东东对工科的挺好,对理科就一般了。理科生嘛,建议去读读M文件,知道计算的原理。
>> solve('x+y=1','y')
ans =
-x+1
换言之,如果方程个数少于自变量个数的话,那么不可能解出最终结果的,因此需要定制表达变量。
>> [x,y]=solve('x^2+y^2-z^2=0','x^2-y^2-3*z=1')
x =
[ 1/2*(2+2*z^2+6*z)^(1/2)]
[ -1/2*(2+2*z^2+6*z)^(1/2)]
[ 1/2*(2+2*z^2+6*z)^(1/2)]
[ -1/2*(2+2*z^2+6*z)^(1/2)]
y =
[ 1/2*(-2+2*z^2-6*z)^(1/2)]
[ 1/2*(-2+2*z^2-6*z)^(1/2)]
[ -1/2*(-2+2*z^2-6*z)^(1/2)]
[ -1/2*(-2+2*z^2-6*z)^(1/2)]
>> z=solve('x^2+y^2-z^2=0','x^2-y^2-3*z=1')
z =
x: [4x1 sym]
y: [4x1 sym]
>> z.x(1),z.x(2)
ans =
1/2*(2+2*z^2+6*z)^(1/2)
ans =
-1/2*(2+2*z^2+6*z)^(1/2)
查找最近的结果
>> fzero(inline('exp(-x)-sin(x)'),0)
ans =
0.5885
>> fzero(inline('exp(-x)-sin(x)'),2)
ans =
3.0964
>> fzero(inline('exp(-x)-sin(x)'),5)
ans =
6.2850
2.6 向量与矩阵
创建向量:
>> x=[1 2 3 4 5]
x =
1 2 3 4 5
>> x=[2,3,4,5,6]
x =
2 3 4 5 6
>> x=1:9
x =
1 2 3 4 5 6 7 8 9
>> x=1:2:9
x =
1 3 5 7 9
向量元素的提取:
>> x(1)
ans =
1
转置
>> x'
ans =
1
3
5
7
9
向量的操作
>> x
x =
1 3 5 7 9
>> y
y =
0 2 4 6 8
>> x+y
ans =
1 5 9 13 17
>> x-y
ans =
1 1 1 1 1
>> x.*y
ans =
0 6 20 42 72
>> y./x
ans =
0 0.6667 0.8000 0.8571 0.8889
创建矩阵
>> A=[1,2,3,4;2,3,4,5;3,4,5,6;4,5,6,7]
A =
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
>> x
x =
1 2 3 4
>> A*x'
ans =
30
40
50
60
2.7 内置函数
例如 sqrt,sin,cos,tan,atan,log,exp等通用函数,也包括gamma,erf,besselj等更专用的函数。
2.8 用户自定义函数
使用inline可以自定义函数
>> f=inline('x^2','x')
f =
Inline function:
f(x) = x^2
>> f(2)
ans =
4
2.9 画图
ezplot
>> ezplot('x^2',[-5,5])
ezplot全民叫做easy plot,从名字就知道了,它可以提供简易的画图功能。
为了让函数看起来更像函数,可以先将变量符号化
>> syms 'x'
>> ezplot(x^2-x+sin(x),[-2,2])
>> title "function 1"
该命令可以设置图像的标题
>> axis([-2,2,-0.5,5.5])
该命令可以调整坐标轴,前面2个表示x坐标轴,后面2个表示y坐标轴
plot
>> x=1:9
x =
1 2 3 4 5 6 7 8 9
>> y=2:10
y =
2 3 4 5 6 7 8 9 10
>> plot(x,y)
简单地说,plot可以对传入的x,y变量进行画图,当然,改变x,y就可以改变画图方式,如此可用性就很大了。
>> x=1:9;y=sin(x)+cos(x);
>> plot(x,y)
如何将多个图形画在同一个图形上,在matlab中有多种方式
>> ezplot(’exp(-x)’, [0 10])
>> hold on
>> ezplot(’sin(x)’, [0 10])
>> hold off
>> title ’exp(-x) and sin(x)’
>> X = 0:0.1:10;
>> plot(X, exp(-X), X, sin(X))
2.10 M文件
format long
x = [0.1, 0.01, 0.001];
y = sin(x)./x
将上面3行存在文件中f1.m,切换到该目录,在命令行输入文件名f1即可得到输出
y =
0.99833416646828 0.99998333341667 0.99999983333334