Matlab高级编程

绘图

在MATLAB中绘制函数图形的步骤如下:

  • 先定义变量 x,通过指定的变量 x 值的范围,该函数被绘制;
  • 然后定义函数, y = f(x);
  • 最后调用 plot 命令,如 plot(x, y)。

接下来我们通过例子绘制简单的函数 y = x , x 值的范围从0到100,增量为5。

在MATLAB中建立一个脚本文件,输入下述代码:

x = [0:5:100];
y = x; plot(x, y)

运行该文件,MATLAB会显示下述图形:

让我们举一个例子,绘制函数 y = x2

在这个例子中,我们将绘制两个图形具有相同的函数,但在第二次,我们将减少值的增量。

请注意,因为减少了增量,图形会变得平滑。

在MATLAB中建立一个脚本文件,输入下述代码:

x = [1 2 3 4 5 6 7 8 9 10];
x = [-100:20:100];
y = x.^2;
plot(x, y)

运行该文件,MATLAB 显示如下图形:

更改代码文件小,减少增量5:

x = [-100:5:100];
y = x.^2;
plot(x, y)

MATLAB绘制出一条平滑的曲线图:

MATLAB添加标题,标签,网格线和缩放的图形

我们可以在 MATLAB 中添加标题,调整 x 轴和 y 轴,网格线,并沿标签美化图形。

  • xlabel 和 ylabel 指令产生沿 x 轴和 y 轴的标签。
  • 标题命令允许你生成图表上的一个标题。
  • 网格命令允许你生成图上的网格线。
  • 轴等于命令允许生成与同等规模因素和空间两个坐标轴上的积点。
  • 轴方形命令生成一个正方形的积点。

详细示例

在MATLAB中建立一个脚本文件,输入下述代码:

x = [0:0.01:10];
y = sin(x);
plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'),
grid on, axis equal

在MATLAB中会生成下图:

MATLAB在同一张图上绘制多个函数

在MATLAB中可以绘制多个图形相同的积点。下面的例子演示了这一概念:

具体示例

在MATLAB中建立一个脚本文件,并输入下述代码:

x = [0 : 0.01: 10];
y = sin(x);
g = cos(x);
plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')

MATLAB会生成下图:

MATLAB在走势图上的颜色设置

MATLAB包含了八个绘制图形的基本颜色选项,下表提供了显示的颜色以及相应的代码:

Color Code
White w
Black k
Blue b
Red r
Cyan c
Green g
Magenta m
Yellow y

具体示例

让我们绘制两个多项式的图形:

  • f(x) = 3x4 + 2x3+ 7x2 + 2x + 9 and
  • g(x) = 5x3 + 9x + 2

在MATLAB中建立一个脚本文件,并输入下述代码:

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r', x, g, 'g')

运行该文件,MATLAB会生成下图:

MATLAB设置轴刻度

该轴命令允许您设置轴的刻度,您可以提供的最小值和最大值的 x 和 y 轴,使用轴命令的方式如下:

axis ( [xmin xmax ymin ymax] )

具体示例

在 MATLAB 中建立一个脚本文件,并输入下述代码:

x = [0 : 0.01: 10];
y = exp(-x).* sin(2*x + 3);
plot(x, y), axis([0 10 -1 1])

运行该文件,MATLAB会生成下图:

MATLAB生成子图

当创建一个数组地块在相同的数字,这些地块被称为子图。

MATLAB 中使用 subplot 命令创建子图。 subplot 命令的语法如下:

subplot(m, n, p)

其中,m 和 n 为积阵列的行和列的数量,p 指定把一个特定的积。

subplot 命令建立的每个绘图都可以有其自己的特点。

具体示例

让我们生成下述的两个图:

  • y = e−1.5xsin(10x)
  • y = e−2xsin(10x)

在MATLAB中建立一个脚本文件,并输入下述代码:

x = [0:0.01:5];
y = exp(-1.5*x).*sin(10*x);
subplot(1,2,1)
plot(x,y), xlabel('x'),ylabel('exp(–1.5x)*sin(10x)'),axis([0 5 -1 1])
y = exp(-2*x).*sin(10*x);
subplot(1,2,2)
plot(x,y),xlabel('x'),ylabel('exp(–2x)*sin(10x)'),axis([0 5 -1 1])

运行该文件,MATLAB会生成下图:

图形

在上节内容中我们大概了解了MATLAB绘图的一些基本操作命令,在本节我们将继续探索MATLAB绘图和图形功能,内容包括:

  • 如何绘制二维条形图
  • 如何绘制等值线
  • 如何绘制三维图

MATLAB绘制条形图

MATLAB 中使用 bar 命令绘制一个二维条形图。

具体示例

如果有一个包含10名学生的教室,这些学生获得的分数的百分比是75,58,90,87,50,85,92,75,60和95,使用这个数据,我们将绘制条形图。

在MATLAB中建立一个脚本文件,并输入下述代码:

x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y), xlabel('Student'),ylabel('Score'),
title('First Sem:')
print -deps graph.eps

运行该文件,MATLAB显示如下的棒形图:

MATLAB绘制等值线

contour 线的两个变量的函数的曲线,沿着该函数具有一个恒定值。加入等于标高点,一个给定的水平,如平均海平面以上用于创建等高线图等高线。

MATLAB 提供了一个轮廓绘制等高线图的函数。

具体例子

让我们生成的等高线图,显示了对于一个给定的功能的轮廓线 g = f(x, y)。这个函数有两个变量,因此,我们将生成两个独立的变量,即两个数据集 x 和 y。这是通过调用 meshgrid 命令。

meshgrid 命令是用于产生一个矩阵的元素,赋予 x 和 y 的范围内进行了在每一种情况下的增量同规格一起。

让我们绘制函数 g = f(x, y), where −5 ≤ x ≤ 5, −3 ≤ y ≤ 3,这两个值的增量为0.1。这些变量设置语法为:

[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);

最后,我们需要分配功能,函数是:x2 + y2

在 MATLAB 中一个脚本文件,并输入下述代码:

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables
g = x.^2 + y.^2;                     % our function
contour(x,y,g)                       % call the contour function
print -deps graph.eps
运行该文件,MATLAB显示的等高线图如下:

让我们修改代码,慢慢美化该等高线图:

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables
g = x.^2 + y.^2;                     % our function
[C, h] = contour(x,y,g);             % call the contour function
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
print -deps graph.eps
运行该文件,MATLAB显示的等高线图变成下述样子:

MATLAB绘制三维图

三维绘图基本显示两个变量中的一个函数定义的表面,g = f (x,y)。

像以前一样,定义 g,我们首先创建一组点(X,Y)函数,使用 meshgrid 命令在域;接下来,我们该函数本身分配;最后使用 surf 命令来创建曲面图。

具体示例

让我们建立一个三维地图函数表面 g = xe-(x2 + y2)

在MATLAB中建立一个脚本文件,并输入下述代码:

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

运行该文件,MATLAB 显示下面的3-D地图:

MATLAB中也可以使用的网格的命令来生成一个三维表面。然而,surfcommand 显示连接线和面的表面的颜色,而 meshcommand 创建一个线框表面色线,连接定义点。

代数

到本节为止,我们已经看到,所有的例子 MATLAB 方式工作以及GNU(或者称为Octave)。但是在解决基本的代数方程的问题上,MATLAB 和 Octave 有点差别,因此对于 MATLAB 和 octave 会单独分开介绍。

对于因式分解以及简化代数表达式,我们也会进=进行接触。

在MATLAB解决基本的代数方程组

MATLAB 中使用 solve 命令求解代数方程组。在其最简单的形式,solve 函数需要括在引号作为参数方程。

例如,让我们在方程求解 x, x-5 = 0

solve('x-5=0')

MATLAB执行上述语句,返回下述结果:

ans =
 5

还可以调用求解函数为:

y = solve('x-5 = 0')

MATLAB执行上述语句,返回以下结果:

y =
 5

甚至可能不包括的右边的方程:

solve('x-5')

MATLAB执行上述语句,返回以下结果:

ans =
 5

然而,如果公式涉及多个符号,那么MATLAB默认情况下,假定正在解决 x,解决命令具有另一种形式:

solve(equation, variable)

在那里,还可以提到的变量。

例如,让我们来解决方程 v – u – 3t2 = 0, 或 v 在这种情况下,我们应该这样写:

solve('v-u-3*t^2=0', 'v')

MATLAB执行上述语句,返回以下结果:

ans =
 3*t^2 + u

MATLAB解决基本在Octave中代数方程组

根命令用于求解代数方程组 Octave ,可以写上面的例子如下:

例如,让我们在方程求解x , x-5 = 0

roots([1, -5])

Octave 执行上述语句,返回以下结果:

 ans =
 5

还可以调用求解函数为:

y = roots([1, -5])

Octave 执行上述语句,返回以下结果:

 y =
 5

在MATLAB解决二次方程

solve 命令也可以解决高阶方程。它经常被用来求解二次方程,该函数返回在数组中的方程的根。

下面举例子解决二次方程 x2 -7x +12 = 0。

在MATLAB中建立一个脚本文件,并输入下述代码:

eq = 'x^2 -7*x + 12 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

运行该文件,显示以下结果:

The first root is: 
3
The second root is: 
4

Octave二次方程求解

下面的例子解决二次方程 x2 -7x +12 = 0 在 Octave 中。创建立一个脚本文件,并输入下述代码:

s = roots([1, -7, 12]);

disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

运行该文件,显示以下结果:

The first root is: 
 4
The second root is: 
 3

在MATLAB解高阶方程

solve 命令还可以解决高阶方程。例如,让我们来解决一个三次方程 (x-3)2(x-7) = 0

solve('(x-3)^2*(x-7)=0')

MATLAB执行上述语句,返回以下结果:

ans =
  3
  3
  7

在高阶方程的情况下,根长含有许多术语。可以得到的数值如根,把它们转换成一倍。

下面的例子解决了四阶方程 x4 − 7x3 + 3x2 − 5x + 9 = 0.

在MATLAB中建立一个脚本文件,并输入下述代码:

eq = 'x^4 - 7*x^3 + 3*x^2 - 5*x + 9 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));
disp('The third root is: '), disp(s(3));
disp('The fourth root is: '), disp(s(4));
% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

运行该文件,返回以下结果:

 The first root is: 
6.630396332390718431485053218985
 The second root is: 
1.0597804633025896291682772499885
 The third root is: 
- 0.34508839784665403032666523448675 - 1.0778362954630176596831109269793*i
 The fourth root is: 
- 0.34508839784665403032666523448675 + 1.0778362954630176596831109269793*i
Numeric value of first root
	6.6304
Numeric value of second root
	1.0598
Numeric value of third root
  -0.3451 - 1.0778i
Numeric value of fourth root
  -0.3451 + 1.0778i

请注意,在过去的两个根是复数。

在 Octave求解高阶方程

下面的例子解决了四阶方程 x4 − 7x3 + 3x2 − 5x + 9 = 0.

建立一个脚本文件,并输入下述代码:

v = [1, -7,  3, -5, 9];

s = roots(v);
% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

运行该文件,返回以下结果:

Numeric value of first root
 6.6304
Numeric value of second root
-0.34509 + 1.07784i
Numeric value of third root
-0.34509 - 1.07784i
Numeric value of fourth root
 1.0598

在MATLAB中求解方程组

solve 命令也可以用于生成涉及一个以上的变量的方程系统的解决方案。

我们求解方程:

5x + 9y = 5

3x – 6y = 4

在MATLAB中建立一个脚本文件,并输入下述代码:

s = solve('5*x + 9*y = 5','3*x - 6*y = 4');
s.x
s.y

运行该文件,显示以下结果:

ans =
 22/19
ans =
-5/57

用同样的方法,可以解决大型线性系统。

请考虑以下的方程组:

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

Octave方程求解系统

我们有一点点不同的方法来解决系统 'n' 的 'n' 未知数的线性方程组。

让我们求解方程:

5x + 9y = 5

3x – 6y = 4

这样的系统中的线性方程组的单一的矩阵方程可写为 Ax = b, 其中 A 是系数矩阵,b 是含有线性方程组右侧的列向量,x 是列向量,代表在下面的程序中所示

创建一个脚本文件,并键入下面的代码:

A = [5, 9; 3, -6];
b = [5;4];
A  b

运行该文件,显示以下结果:

ans =

   1.157895
  -0.087719

用同样的方法,可以解决大型线性系统给出如下:

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

MATLAB扩大和收集方程

MATLAB中 expand 和 collect 命令用于扩展,并分别收集一个方程。下面的示例演示的概念:

当工作中有许多象征性的函数,你应当声明你的变量是象征意义的。

在MATLAB中建立一个脚本文件,并输入下述代码:

syms x %symbolic variable x
syms y %symbolic variable x
% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(sin(2*x))
expand(cos(x+y))
 
% collecting equations
collect(x^3 *(x-7))
collect(x^4*(x-3)*(x-5))

运行该文件,显示以下结果:

 ans =
 x^2 + 4*x - 45
 ans =
 x^4 + x^3 - 43*x^2 + 23*x + 210
 ans =
 2*cos(x)*sin(x)
 ans =
cos(x)*cos(y) - sin(x)*sin(y)
 ans =
 x^4 - 7*x^3
 ans =
 x^6 - 8*x^5 + 15*x^4 

Octave扩展和收集方程

你需要 symbolic 包,它提供了expand 和 collect 命令来扩大和收集方程。下面的示例演示的概念:

当工作中有许多象征意义的函数,应该声明变量是象征性的,但八度有不同的方法来定义符号变量。注意使用 sin 和 cos,他们还象征意义性的包中定义。

建立一个脚本文件,并输入下述代码:

% first of all load the package, make sure its installed.
pkg load symbolic

% make symbols module available
symbols

% define symbolic variables
x = sym ('x');
y = sym ('y');
z = sym ('z');

% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(Sin(2*x))
expand(Cos(x+y))
 
% collecting equations
collect(x^3 *(x-7), z)
collect(x^4*(x-3)*(x-5), z)

当运行该文件,它会显示以下结果:

ans =

-45.0+x^2+(4.0)*x
ans =

210.0+x^4-(43.0)*x^2+x^3+(23.0)*x
ans =

sin((2.0)*x)
ans =

cos(y+x)
ans =

x^(3.0)*(-7.0+x)
ans =

(-3.0+x)*x^(4.0)*(-5.0+x)

分解和简化代数表达式

factor 命令表达式 factorizes 是一个简化命令的简化表达。

具体例子

建立一个脚本文件,并输入下述代码:

syms x
syms y
factor(x^3 - y^3)
factor([x^2-y^2,x^3+y^3])
simplify((x^4-16)/(x^2-4))

运行该文件,显示以下结果:

ans =
(x - y)*(x^2 + x*y + y^2)
 ans =
 [ (x - y)*(x + y), (x + y)*(x^2 - x*y + y^2)]
 ans =
 x^2 + 4

微积分

MATLAB 中有些问题需要使用微积分来解决,MATLAB提供微分方程求解任何限制的程度和计算方法,并且可以很容易地绘制图形复变函数,并检查最大值,最小值和图形解决原始函数,以及其衍生的其他内容。

在本章中,我们将讨论预演算概念,即计算功能的限制和验证的属性限制。

MATLAB计算限制

在 MATLAB 中如果要限制计算就要使用 limit 命令。其最基本的形式是将表达 limit 命令作为参数,并作为独立变量变为零发现极限的表达。

例如,让我们计算一个函数的极限 f(x) = (x3 + 5)/(x4 + 7), 当 x 趋于零。

syms x
limit((x^3 + 5)/(x^4 + 7))

MATLAB执行上述语句,返回以下结果:

ans =
 5/7 

limit 命令属于符号计算的境界中,你需要使用 SYMS 命令告诉 MATLAB 您使用的符号变量。

limit 命令也可以计算一个函数的限制,作为变量趋于零以外的一些数字。

为了计算 lim x->a(f(x)),我们使用 limit 命令参数,其中,第一个是表达式,第二个是数量,x 趋向,在这里它是a。

例如,让我们计算函数极限 f(x) = (x-3)/(x-1),  x 无限接近于 1.

limit((x - 3)/(x-1),1)

MATLAB执行上述语句,并返回以下结果:

ans =
 NaN

继续执行另外的实例,

limit(x^2 + 5, 3)

MATLAB执行上述语句,返回以下结果:

ans =
 14 

使用Octave计算限制

以下是上面的例子中使用 symbolic 包 Octave 版本,尝试执行和比较的结果:

pkg load symbolic
symbols
x=sym("x");

subs((x^3+5)/(x^4+7),x,0)

Octave 执行上面的语句,并返回以下结果:

ans =
0.7142857142857142857

核查的基本性质限制

代数极限定理提供了一些基本的性能限制。

如下所示:

我们考虑两个函数:

  • f(x) = (3x + 5)/(x - 3)
  • g(x) = x2 + 1.

让我们计算为 x 的函数的限制的倾向 5,这两个函数和验证限制使用这两个函数和MATLAB的基本属性。

详细例子

在MATLAB中建立一个脚本文件,并输入下述代码:

syms x
f = (3*x + 5)/(x-3);
g = x^2 + 1;
l1 = limit(f, 4)
l2 = limit (g, 4)
lAdd = limit(f + g, 4)
lSub = limit(f - g, 4)
lMult = limit(f*g, 4)
lDiv = limit (f/g, 4)

运行该文件时,显示如下结果:

l1 =
 17
  
l2 =
17
  
lAdd =
 34
 
lSub =
 0
  
lMult =
289
  
lDiv =
1

限制使用的基本性质的验证Octave

以下是上面的例子中使用 symbolic 包 Octave 版本,尝试执行和比较的结果:

pkg load symbolic
symbols

x = sym("x");
f = (3*x + 5)/(x-3);
g = x^2 + 1;

l1=subs(f, x, 4)
l2 = subs (g, x, 4)
lAdd = subs (f+g, x, 4)
lSub = subs (f-g, x, 4)
lMult = subs (f*g, x, 4)
lDiv = subs (f/g, x, 4)

Octave 执行上述语句,返回以下结果:

l1 =

17.0
l2 =

17.0
lAdd =

34.0
lSub =

0.0
lMult =

289.0
lDiv =

1.0

MATLAB 左,右侧限制

当一个函数具有某些特定变量的值的不连续性,限制在这一点上不存在。换句话说,限制具有不连续的函数f(x)在x = a ,当不相等的值的限制,当 x 趋向 x 从左侧的值限制为 x 的方法。

这导致的概念左手侧 和右手侧 限制。a限值定为左手侧 x > a 限制,从左侧,即 X 接近的值的 x<a。右手限制为x的极限 - 被定义为,从右边,即x接近值 x>a 。当是不相等的左手系的限制和右手限制,该限制不存在。

让我们考虑一个函数:

f(x) = (x - 3)/|x - 3|

我们将证明 limx->3 f(x) 不存在。 MATLAB帮助我们建立这个事实在两个方面:

  • 通过绘制的函数的曲线图,并示出了不连续
  • 通过计算的限制和显示,两者是不同的。

左手侧和右手侧限制,计算传递字符串 '左' 和 '右' limit 命令的最后一个参数。

具体示例

在MATLAB中建立一个脚本文件,并输入下述代码:

f = (x - 3)/abs(x-3);
ezplot(f,[-1,5])
l = limit(f,x,3,'left')
r = limit(f,x,3,'right')

运行该文件,MATLAB 得出如下的图型:

并显示下面的输出:

l =
 -1
  
r =
1


微分和导数

MATLAB提供用于计算符号导数的diff命令。 以最简单的形式,将要微分的功能传递给diff命令作为参数

例如,计算函数的导数的方程式 f(t) = 3t2 + 2t-2

例子

创建脚本文件并在其中键入以下代码 −

syms t
f = 3*t^2 + 2*t^(-2);
diff(f)

执行上面示例代码,得到以下结果 −

ans =
6*t - 4/t^3

以下是使用Octave 计算的写法 −

pkg load symbolic
symbols

t = sym("t");
f = 3*t^2 + 2*t^(-2);
differentiate(f,t)

执行上面示例代码,得到以下结果 −

ans =
   -(4.0)*t^(-3.0)+(6.0)*t

基本微分规则的验证

下面简要说明微分规则的各种方程或规则,并验证这些规则。 为此,我们将写一个第一阶导数f'(x)和二阶导数f"(x)。

以下是微分的规则 −

规则 1

对于任何函数f和g,任何实数a和b是函数的导数 −

h(x) = af(x) + bg(x)相对于x,由h’(x) = af’(x) + bg’(x)给出。

规则 2

sum和subtraction规则表述为:如果f和g是两个函数,则f'和g'分别是它们的导数,如下 -

(f + g)' = f' + g'

(f - g)' = f' - g'

规则 3

product规则表述为:如果f和g是两个函数,则f'和g'分别是它们的导数,如下

(f.g)' = f'.g + g'.f

规则 4

quotient规则表明,如果f和g是两个函数,则f'和g'分别是它们的导数,那么

(f/g)' = (f'.g - g'.f)/g2

规则 5

多项式或基本次幂规则表述为:如果y = f(x) = xn, 则 f' = n. x(n-1)

这个规则的直接结果是任何常数的导数为零,即如果y = k,那么为任何常数 -

f' = 0

规则 6

chain规则表述为 - 相对于x的函数h(x)= f(g(x))的函数的导数是 -

h'(x)= f'(g(x)).g'(x)

例子

创建脚本文件并在其中键入以下代码 −

syms x
syms t

f = (x + 2)*(x^2 + 3)
der1 = diff(f)

f = (t^2 + 3)*(sqrt(t) + t^3)
der2 = diff(f)

f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
der3 = diff(f)

f = (2*x^2 + 3*x)/(x^3 + 1)
der4 = diff(f)

f = (x^2 + 1)^17
der5 = diff(f)

f = (t^3 + 3* t^2 + 5*t -9)^(-6)
der6 = diff(f)

执行上面示例代码,得到 以下结果 −

f =
   (x^2 + 3)*(x + 2)
 
   der1 =
   2*x*(x + 2) + x^2 + 3
  
f =
   (t^(1/2) + t^3)*(t^2 + 3)
 
   der2 =
   (t^2 + 3)*(3*t^2 + 1/(2*t^(1/2))) + 2*t*(t^(1/2) + t^3)
  
f =
   (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
  
der3 =
   (2*x - 2)*(3*x^3 - 5*x^2 + 2) - (- 9*x^2 + 10*x)*(x^2 - 2*x + 1)
 
f =
   (2*x^2 + 3*x)/(x^3 + 1)
  
der4 =
   (4*x + 3)/(x^3 + 1) - (3*x^2*(2*x^2 + 3*x))/(x^3 + 1)^2
  
f =
   (x^2 + 1)^17
  
der5 =
   34*x*(x^2 + 1)^16
  
f =
   1/(t^3 + 3*t^2 + 5*t - 9)^6
  
der6 =
   -(6*(3*t^2 + 6*t + 5))/(t^3 + 3*t^2 + 5*t - 9)^7

以下是对上面示例的Octave写法 −

pkg load symbolic
symbols

x = sym("x");
t = sym("t");

f = (x + 2)*(x^2 + 3) 
der1 = differentiate(f,x) 

f = (t^2 + 3)*(t^(1/2) + t^3) 
der2 = differentiate(f,t) 

f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) 
der3 = differentiate(f,x) 

f = (2*x^2 + 3*x)/(x^3 + 1) 
der4 = differentiate(f,x) 

f = (x^2 + 1)^17 
der5 = differentiate(f,x) 

f = (t^3 + 3* t^2 + 5*t -9)^(-6) 
der6 = differentiate(f,t)

Octave执行代码并返回以下结果 −

f =

(2.0+x)*(3.0+x^(2.0))
der1 =

3.0+x^(2.0)+(2.0)*(2.0+x)*x
f =

(t^(3.0)+sqrt(t))*(3.0+t^(2.0))
der2 =

(2.0)*(t^(3.0)+sqrt(t))*t+((3.0)*t^(2.0)+(0.5)*t^(-0.5))*(3.0+t^(2.0))
f =

(1.0+x^(2.0)-(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))
der3 =

(-2.0+(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))+((9.0)*x^(2.0)-(10.0)*x)*(1.0+x^(2.0)-(2.0)*x)
f =

(1.0+x^(3.0))^(-1)*((2.0)*x^(2.0)+(3.0)*x)
der4 =

(1.0+x^(3.0))^(-1)*(3.0+(4.0)*x)-(3.0)*(1.0+x^(3.0))^(-2)*x^(2.0)*((2.0)*x^(2.0)+(3.0)*x)
f =

(1.0+x^(2.0))^(17.0)
der5 =

(34.0)*(1.0+x^(2.0))^(16.0)*x
f =

(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-6.0)
der6 =

-(6.0)*(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-7.0)*(5.0+(3.0)*t^(2.0)+(6.0)*t)

指数,对数和三角函数的导数

下表提供了常用指数,对数和三角函数的导数 −

函数 导数
ca.x ca.x.ln c.a (ln is natural logarithm)
ex ex
ln x 1/x
lncx 1/x.ln c
xx xx.(1 + ln x)
sin(x) cos(x)
cos(x) -sin(x)
tan(x) sec2(x), or 1/cos2(x), or 1 + tan2(x)
cot(x) -csc2(x), or -1/sin2(x), or -(1 + cot2(x))
sec(x) sec(x).tan(x)
csc(x) -csc(x).cot(x)

例子

创建脚本文件并在其中键入以下代码 −

syms x
y = exp(x)
diff(y)

y = x^9
diff(y)

y = sin(x)
diff(y)

y = tan(x)
diff(y)

y = cos(x)
diff(y)

y = log(x)
diff(y)

y = log10(x)
diff(y)

y = sin(x)^2
diff(y)

y = cos(3*x^2 + 2*x + 1)
diff(y)

y = exp(x)/sin(x)
diff(y)

执行上面示例代码,得到以下结果 −

y =
   exp(x)
   ans =
   exp(x)

y =
   x^9
   ans =
   9*x^8
  
y =
   sin(x)
   ans =
   cos(x)
  
y =
   tan(x)
   ans =
   tan(x)^2 + 1
 
y =
   cos(x)
   ans =
   -sin(x)
  
y =
   log(x)
   ans =
   1/x
  
y =
   log(x)/log(10)
   ans =
   1/(x*log(10))
 
y =
   sin(x)^2
   ans =
   2*cos(x)*sin(x)
 
y =
   cos(3*x^2 + 2*x + 1)
   ans =
   -sin(3*x^2 + 2*x + 1)*(6*x + 2)
  
y =
   exp(x)/sin(x)
   ans =
   exp(x)/sin(x) - (exp(x)*cos(x))/sin(x)^2

以下代码是上面代码的Octave写法 −

pkg load symbolic
symbols

x = sym("x");
y = Exp(x)
differentiate(y,x)

y = x^9
differentiate(y,x)

y = Sin(x)
differentiate(y,x)

y = Tan(x)
differentiate(y,x)

y = Cos(x)
differentiate(y,x)

y = Log(x)
differentiate(y,x)

% symbolic packages does not have this support
%y = Log10(x)
%differentiate(y,x)

y = Sin(x)^2
differentiate(y,x)

y = Cos(3*x^2 + 2*x + 1)
differentiate(y,x)

y = Exp(x)/Sin(x)
differentiate(y,x)

Octave执行代码并返回以下结果 −

y =

exp(x)
ans =

exp(x)
y =

x^(9.0)
ans =

(9.0)*x^(8.0)
y =

sin(x)
ans =

cos(x)
y =

tan(x)
ans =

1+tan(x)^2
y =

cos(x)
ans =

-sin(x)
y =

log(x)
ans =

x^(-1)
y =

sin(x)^(2.0)
ans =

(2.0)*sin(x)*cos(x)
y =

cos(1.0+(2.0)*x+(3.0)*x^(2.0))
ans =

-(2.0+(6.0)*x)*sin(1.0+(2.0)*x+(3.0)*x^(2.0))
y =

sin(x)^(-1)*exp(x)
ans =

sin(x)^(-1)*exp(x)-sin(x)^(-2)*cos(x)*exp(x)

计算高阶导数

要计算函数f的较高导数,可使用diff(f,n)。

计算函数的二阶导数公式为 y = f(x) = x .e-3x

f = x*exp(-3*x);
diff(f, 2)

MATLAB执行代码并返回以下结果 −

ans =
9*x*exp(-3*x) - 6*exp(-3*x)

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
f = x*Exp(-3*x);
differentiate(f, x, 2)

Octave执行代码并返回以下结果 −

ans =

(9.0)*exp(-(3.0)*x)*x-(6.0)*exp(-(3.0)*x)

例子

在这个例子中,让我们解决一个问题。 假设函数 y = f(x)= 3 sin(x)+ 7 cos(5x)。 我们必须找出方程 f“+ f = -5cos(2x)是否成立。

创建一个脚本文件并在其中键入以下代码 −

syms x
y = 3*sin(x)+7*cos(5*x);  % defining the function
lhs = diff(y,2)+y;        %evaluting the lhs of the equation
rhs = -5*cos(2*x);        %rhs of the equation
if(isequal(lhs,rhs))
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

运行该文件时,它会显示以下结果 −

No, the equation does not hold true
Value of LHS is: 
-168*cos(5*x)

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
y = 3*Sin(x)+7*Cos(5*x);           % defining the function
lhs = differentiate(y, x, 2) + y;  %evaluting the lhs of the equation
rhs = -5*Cos(2*x);                 %rhs of the equation

if(lhs == rhs)
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

Octave执行代码并返回以下结果 −

No, the equation does not hold true
Value of LHS is: 
-(168.0)*cos((5.0)*x)

查找曲线的最大和最小值

如果正在搜索图形的局部最大值和最小值,基本上是在特定地点的函数图上或符号变量的特定值范围内查找最高点或最低点。

对于函数y = f(x),图形具有零斜率的图上的点称为固定点。 换句话说,固定点是f'(x)= 0。

要找到微分的函数的固定点,需要将导数设置为零并求解方程。

例子

让我们找到函数的静止点 f(x) = 2x3 + 3x2 − 12x + 17

请执行以下步骤 −

首先让我们进入函数并绘制其图形。

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y)

MATLAB执行代码并返回以下图表 −

以下是上述示例的Octave等效代码 −

pkg load symbolic
symbols

x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");

ezplot(y)
print -deps graph.eps

我们的目标是在图上找到一些局部最大值和最小值,所以让我们在图上找到区间[-2,2]的局部最大值和最小值。

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y, [-2, 2])

MATLAB执行代码并返回以下图表 −

以下是上述示例的Octave等效代码 −

pkg load symbolic
symbols

x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");

ezplot(y, [-2, 2])
print -deps graph.eps

接下来,让我们计算导数。

g = diff(y)

MATLAB执行代码并返回以下结果 −

g =
   6*x^2 + 6*x - 12

这是Octave相当于上面的计算 −

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)

Octave执行代码并返回以下结果 −

g =
   -12.0+(6.0)*x+(6.0)*x^(2.0)

让我们求解导数函数g,得到它变为零的值。

s = solve(g)

MATLAB执行代码并返回以下结果 −

s =
   1
   -2

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)
roots([6, 6, -12])

Octave执行代码并返回以下结果 −

g =

-12.0+(6.0)*x^(2.0)+(6.0)*x
ans =

  -2
   1

这与我们的情节一致。 因此,让我们在关键点x = 1,-2处评估函数f。我们可以使用subs命令替换符号函数中的值。

subs(y, 1), subs(y, -2)

MATLAB执行代码并返回以下结果 −

ans =
   10
ans =
   37

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)

roots([6, 6, -12])
subs(y, x, 1), subs(y, x, -2)
ans =
   10.0
ans =
   37.0-4.6734207789940138748E-18*I

因此,函数f(x)= 2x3+ 3x2 - 12x + 17的最小值和最大值在区间[-2,2]中为10 和37。

求解微分方程

MATLAB提供了用于求解微分方程的dsolve命令。

单个方程的解的最基本的dsolve命令形式是 -

dsolve('eqn') 

其中eqn是用于输入方程式的文本串

它返回一个符号解,其中包含一组任意常量,MATLAB标记C1,C2等等。

还可以为问题指定初始和边界条件,以逗号分隔的列表遵循以下公式 −

dsolve('eqn','cond1', 'cond2',…)  

为了使用dsolve命令,导数用D表示。例如,像f'(t)= -2 * f + cost(t)这样的等式输入为 −

'Df = -2*f + cos(t)'

较高阶导数由D导数的顺序表示。

例如,方程f"(x) + 2f'(x) = 5sin3x应输入为 −

'D2y + 2Dy = 5*sin(3*x)'

下面来看一个一阶微分方程的简单例子:y'= 5y。

s = dsolve('Dy = 5*y')

MATLAB执行代码并返回以下结果 −

s =
   C2*exp(5*t)

再来一个二阶微分方程的例子:y“-y = 0,y(0)= -1,y'(0)= 2。

dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')

MATLAB执行代码并返回以下结果 −

ans =
   exp(t)/2 - (3*exp(-t))/2


整合集成

例如,从我们之前的例子中

  • 第一种类型问题是给出了函数的导数,并且想要找到该函数。所以基本上扭转了差异化的过程。 这种反向过程被称为抗分化,或者找到原始函数,或者找到不确定的积分。
  • 第二种类型问题是涉及相当多的非常小的数量,然后随着数量的大小接近于零,而术语的数量趋向于无穷大。这个过程导致了定积分的定义。

确定的积分用于查找区域,体积,重心,转动惯量,由力完成的工作以及许多其他应用。

使用MATLAB找到不确定的积分

根据定义,如果函数f(x)的导数是f'(x),那么可以说f'(x)相对于x的不确定积分是f(x)。 例如,由于x2的导数(相对于x)为2x,可以说2x的不确定积分是x2

在符号中 −

f'(x2) = 2x, 因此可相当于,

∫ 2xdx = x2.

不确定积分并不是唯一的,因为对于常数c的任何值,x2 + c的导数也将是2x。

这用符号表示为 −

∫ 2xdx = x2 + c.

其中,c被称为“任意常数”。

MATLAB提供了一个用于计算表达式积分的int命令。 为了得出一个函数的无限积分的表达式,它的写法为 −

int(f);

例如,从我们之前的例子中 −

syms x 
int(2*x)

MATLAB执行上述语句并返回以下结果 −

ans =
   x^2

例子 1

在这个例子中,让我们找到一些常用表达式的积分。创建脚本文件并键入以下代码 in it −

syms x n

int(sym(x^n))
f = 'sin(n*t)'
int(sym(f))
syms a t
int(a*cos(pi*t))
int(a^x)

运行该文件时,它将显示以下结果 −

ans =
   piecewise([n == -1, log(x)], [n ~= -1, x^(n + 1)/(n + 1)])
f =
sin(n*t)
ans =
   -cos(n*t)/n
   ans =
   (a*sin(pi*t))/pi
   ans =
   a^x/log(a)

例子 2

创建脚本文件并键入以下代码 in it −

syms x n
int(cos(x))
int(exp(x))
int(log(x))
int(x^-1)
int(x^5*cos(5*x))
pretty(int(x^5*cos(5*x)))

int(x^-5)
int(sec(x)^2)
pretty(int(1 - 10*x + 9 * x^2))

int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2)
pretty(int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2))

请注意,pretty函数返回表达式的更可读格式。

运行该文件时,它将显示以下结果 −

ans =
   sin(x)
 
ans =
   exp(x)
 
ans =
   x*(log(x) - 1)
 
ans =
   log(x)
 
ans =
(24*cos(5*x))/3125 + (24*x*sin(5*x))/625 - (12*x^2*cos(5*x))/125 + (x^4*cos(5*x))/5 - (4*x^3*sin(5*x))/25 + (x^5*sin(5*x))/5
									2             4 
   24 cos(5 x)   24 x sin(5 x)   12 x  cos(5 x)   x  cos(5 x) 
   ----------- + ------------- - -------------- + ------------ 
	  3125            625             125              5 
   
		3             5 
 
   4 x  sin(5 x)   x  sin(5 x) 
   ------------- + ----------- 
		 25              5
 
ans =
-1/(4*x^4)
 
ans =
tan(x)
		2 
  x (3 x  - 5 x + 1)
 
ans = 
- (7*x^6)/12 - (3*x^5)/5 + (5*x^4)/8 + x^3/2
 
	  6      5      4    3 
	7 x    3 x    5 x    x 
  - ---- - ---- + ---- + -- 
	 12     5      8     2

使用MATLAB查找定积分

根据定义,定积分基本上是总和的极限。 我们使用定积分来找到诸如曲线和x轴之间的区域以及两条曲线之间的区域之类的区域。 定义积分也可用于其他情况,其中所需数量可表示为总和的极限.

int 函数可以通过传递要计算积分的限制来用于明确的积分。

计算

we write,

int(x, a, b)

例如,要计算值

我们写 −

int(x, 4, 9)

MATLAB执行上述语句并返回以下结果 −

ans =
   65/2

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
f = x;
c = [1, 0];
integral = polyint(c);

a = polyval(integral, 9) - polyval(integral, 4);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 −

Area: 

   32.500

可以使用由Octave提供的quad()函数给出替代解决方案,如下所述 −

pkg load symbolic
symbols

f = inline("x");
[a, ierror, nfneval] = quad(f, 4, 9);

display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 −

Area: 
   32.500

例子 1

让我们计算x轴和曲线之间的区域 y = x3−2x+5 和纵坐标 x = 1 和 x = 2.

所需面积由下式给出 −

创建脚本文件并键入以下代码 −

f = x^3 - 2*x +5;
a = int(f, 1, 2)
display('Area: '), disp(double(a));

运行该文件时,它将显示以下结果 −

a =
23/4
Area: 
   5.7500

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
f = x^3 - 2*x +5;
c = [1, 0, -2, 5];
integral = polyint(c);

a = polyval(integral, 2) - polyval(integral, 1);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 −

Area: 

   5.7500

可以使用由Octave提供的quad()函数给出替代解决方案,如下所述 −

pkg load symbolic
symbols

x = sym("x");
f = inline("x^3 - 2*x +5");

[a, ierror, nfneval] = quad(f, 1, 2);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 −

Area: 
   5.7500

例子 2

找到曲线下面的区域: f(x) = x2 cos(x) for −4 ≤ x ≤ 9.

创建脚本文件并编写以下代码 −

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

运行该文件时,MATLAB绘制图形 −

输出如下 −

a = 
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
 
Area: 
   0.3326

以下是Octave相当于上述计算 −

pkg load symbolic
symbols

x = sym("x");
f = inline("x^2*cos(x)");

ezplot(f, [-4,9])
print -deps graph.eps

[a, ierror, nfneval] = quad(f, -4, 9);
display('Area: '), disp(double(a));



多项式

在 MATLAB 中,多项式用一个行向量表示,行向量的元素值为多项式系数按幂次的降序排列。

例如,方程 P(x) = x4 + 7x3 - 5x + 9 可以表示为:

p = [1 7 0 -5 9];

MATLAB计算多项式

MATLAB中 polyval 函数用于将指定的值 - 计算多项式。例如,要计算我们本节开始时举例的多项式 p, x = 4,输入:

p = [1 7 0  -5 9];
polyval(p,4)

MATLAB 执行上述语句,返回以下结果:

ans =
   693

MATLAB 还提供了计算矩阵多项式 polyvalm 函数。矩阵多项式一个多项式矩阵变量。

例如,我们建立一个正方形矩阵 X 并计算多项式 p:

p = [1 7 0  -5 9];
X = [1 2 -3 4; 2 -5 6 3; 3 1 0 2; 5 -7 3 8];
polyvalm(p, X)

MATLAB执行上述语句,返回以下结果:

ans =
		2307       -1769        -939        4499
		2314       -2376        -249        4695
		2256       -1892        -549        4310
		4570       -4532       -1062        9269

查找多项式的根

根函数可以计算多项式的根。

例如,要计算多项式 p,输入根:

p = [1 7 0  -5 9];
r = roots(p)

MATLAB执行上述语句,返回以下结果:

r =
  -6.8661 + 0.0000i
  -1.4247 + 0.0000i
   0.6454 + 0.7095i
   0.6454 - 0.7095i

 poly 函数是根函数,并返回多项式的系数的倒数。

例如:

p2 = poly(r)

MATLAB执行上述语句,返回以下结果:

    p2 =
	1.0000    7.0000    0.0000   -5.0000    9.0000

多项式曲线拟合

polyfit 函数找到一个多项式的系数,适合采用最小二乘意义上的一组中的数据。

如果 x 和 y 是两个向量含有的 x 和 y 被拟合数据的一个 n 次多项式,那么我们得到的多项式拟合的数据通过写入

p = polyfit(x,y,n)

详细例子

在MATLAB中建立一个脚本文件,并输入下述代码:

x = [1 2 3 4 5 6]; y = [5.5 43.1 128 290.7 498.4 978.67];  %data
p = polyfit(x,y,4)   %get the polynomial
% Compute the values of the polyfit estimate over a finer range, 
% and plot the estimate over the real data values for comparison:
x2 = 1:.1:6;          
y2 = polyval(p,x2);
plot(x,y,'o',x2,y2)
grid on

运行该文件,MATLAB显示以下结果:

    p =
	4.1056  -47.9607  222.2598 -362.7453  191.1250

并绘制下图:

 

变换

MATLAB中提供了命令与转换,如拉普拉斯和傅里叶变换。

MATLAB中变换是一种用来从另一个角度简化数据分析科学和工程。

傅立叶变换实现了时间与频率的转换;拉普拉斯变换可以将时域函数变换复频域函数,简化微积分方程计算。

MATLAB提供的拉普拉斯,傅里叶和FFT命令拉普拉斯,傅里叶和快速傅里叶变换工作。

MATLAB拉普拉斯变换

时间函数 f(t)的拉普拉斯变换的函数,通过下式给出下面的积分:

拉普拉斯变换的变换函数 f(t)也表示为,F(次)。可以看到这种变换或一体化进程的符号变量t的函数,F(T),转换成另一个函数F(s)和另一个变量s。

拉普拉斯变换将微分方程转化为代数。要计算一个函数 f(t)的拉普拉斯变换,这样写:

laplace(f(t))

具体示例

接下来,我们会计算一些常用函数的拉普拉斯变换。

在MATLAB中建立一个脚本文件,并输入下述代码:

syms s t a b w
laplace(a)
laplace(t^2)
laplace(t^9)
laplace(exp(-b*t))
laplace(sin(w*t))
laplace(cos(w*t))

运行该文件,显示以下结果:

 ans =
 1/s^2

 ans =
 2/s^3

 ans =
 362880/s^10

 ans =
 1/(b + s)
  
ans =
 w/(s^2 + w^2)
  
ans =
 s/(s^2 + w^2)

MATLAB逆拉普拉斯变换

MATLAB中使用命令 ilaplace 计算拉普拉斯逆变换。

例如:

ilaplace(1/s^3)

MATLAB执行上述语句,并显示结果:

 ans =
 t^2/2

详细例子

在MATLAB中建立一个脚本文件,并输入下述代码:

syms s t a b w
ilaplace(1/s^7)
ilaplace(2/(w+s))
ilaplace(s/(s^2+4))
ilaplace(exp(-b*t))
ilaplace(w/(s^2 + w^2))
ilaplace(s/(s^2 + w^2))

运行该文件,显示以下结果:

ans =
t^6/720

 ans =
 2*exp(-t*w)

 ans =
 cos(2*t)

 ans =
 ilaplace(exp(-b*t), t, x)

 ans =
 sin(t*w)

 ans =
 cos(t*w)

MATLAB傅立叶变换

傅立叶变换,常用的时间变换的数学函数,函数 f(t),进入一个新的功能,有时记为或F组,其参数是频率与周期/秒(赫兹)或每秒弧度的单位。新的函数,然后被称为傅里叶变换和/或函数f的频谱。

详细例子

在MATLAB中建立一个脚本文件,并输入下述代码:

syms x 
f = exp(-2*x^2);  %our funtion
ezplot(f,[-2,2])  % plot of our function
FT = fourier(f)	% Fourier transform

运行该文件,MATLAB绘制出下图:

并显示以下结果:

  FT =
 (2^(1/2)*pi^(1/2)*exp(-w^2/8))/2

折线图的傅里叶变换为:

ezplot(FT)

给出了如下图:

MATLAB傅立叶逆变换

MATLAB提供的 ifourier 命令,用于计算一个函数的傅立叶逆变换。

例如:

f = ifourier(-2*exp(-abs(w)))

MATLAB执行上述语句,并显示如下结果:

f =
-2/(pi*(x^2 + 1))

 

GNU Octave

GNU Octave 是一种高级编程语言,像 MATLAB,它主要是用 MATLAB 兼容。

GNU Octave 也可以用来进行数值计算,还有丰富的 C++ 接口可以让用户编程时调用。

Octave 和 MATLAB 共同的特点

  • 矩阵的基本数据类型
  • 它内置支持复数
  • 它具有内置数学函数和库
  • 它支持用户自定义功能

GNU Octave 是自由可再分发的软件,这意味着你可以在自由软件基金会发布的GNU通用公共许可证(GPL)的条款下重新分配或对它进行修改。

MATLAB 和 Octave

极大一部分的 MATLAB 程序运行在 Octave,但是有一些 Octave 支持的语法是 MATLAB 不支持的,所以这些 Octave 程序可能无法正常运行。

就好比 MATLAB 只支持单引号,但是Octave能够支持单,双引号来定义字符串

兼容的示例

本教程中涉及的几乎所有的例子都是用 MATLAB 以及 Octave 兼容。

在 MATLAB 和 Octave 试试下面的例子,没有任何语法的变化并且会有相同的结果产生:

以下例子中将建立一个3D表面地图函数 g = xe-(x2 + y2) 。

在MATLAB中建立一个脚本文件,并输入下述代码:

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

运行该文件,显示出的3-D地图:

不兼容的例子

MATLAB 中有一部分功能是不能够在 Octave 中使用的,举几个例子:微分和积分积分,无论是从语言还是其他角度,这并不完全匹配。

下面给出两种类型的例子,以此显示他们的语法不同的地方。

在下面的例子中 MATLAB 和 Octave 使不同功能的使用面积曲线: f(x) = x2 cos(x) for −4 ≤ x ≤ 9。

我们先来看看 MATLAB 中的代码:

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

运行该文件,MATLAB绘制如下图表:

显示结果如下:

a =
 
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
 
Area: 
	0.3326

在 Octave 中使用相同的面积曲线,必须使用符号包如下:

pkg load symbolic
symbols

x = sym("x");

f = inline("x^2*cos(x)");

ezplot(f, [-4,9])
print -deps graph.eps

[a, ierror, nfneval] = quad(f, -4, 9);

display('Area: '), disp(double(a));


Simulink仿真

Simulink 是 MATLAB 最重要的组件之一,它提供一个动态系统建模、仿真和综合分析的集成环境。本节要教你建立 simulink 仿真程序。

它可以让你将 MATLAB 算法模型,以及导出到MATLAB仿真结果作进一步分析。

Simulink 支持:

  • 系统级设计
  • 模拟
  • 自动代码生成
  • 嵌入式系统的测试和验证

MathWorks 还提供了其他一些附加产品和第三方硬件和软件产品可用于 Simulink。

下列是简要说明:

  • Stateflow 允许开发状态机器和流程图。
  • Simulink Coder 可以自动生成C源代码系统的实时实现。
  • xPC Target 可基于x86 实时系统提供了一个环境模拟和测试 Simulink 和 Stateflow 模型的实时物理系统上。
  • Embedded Coder 支持特定的嵌入式目标。
  • HDL Coder 允许自动生成可综合的VHDL和Verilog
  • SimEvents 提供了一个库的图形积木造型排队系统

Simulink 是能够通过造型风格检查,要求可追溯性和模型覆盖分析模型系统的核查和验证。

Simulink 设计验证,让您识别设计错误,并生成测试模型检查情况。

使用 Simulink

要打开 Simulink,在 MATLAB 工作空间的类型:

simulink

使用库浏览打开 Simulink ,库浏览是用于建立仿真模型。

在左侧窗格中,你会发现几个库的基础上,各系统分类,点击每一个设计模块将显示在右侧的窗口窗格中。

建立模型

要建立一个新的模型库浏览的工具栏上,单击新建按钮,将打开一个新的未命名的示范窗口,如下图所示:

Simulink 模型的框图。

模型元素的加入,通过选择适当的元素从“库”浏览器,并将其拖动到模型窗口,或者,您可以复制​​模型元素,将它们粘贴到模型窗口。

具体例子

从 Simulink 库中的拖放到你的项目。

如果在本实施例的目的,2块将被用于模拟 - 源(信号)和一个接收器(范围)。信号发生器(源)产生模拟信号,然后将图形可视化的范围(片)。

首先从库中所需的块拖动到项目窗口;然后,将块连接在一起,可以通过拖动一个街区到另一个连接点连接器。

让我们“正弦波”拖动到模型块。

选择 'Sinks' 从库中拖出一个 “Scope” 到模型块。

将信号线从的输出正弦波块,范围块的输入。

运行仿真按下 “Run” 按钮,所有参数保持默认(从模拟菜单中,您可以更改它们)。

我们可以从下图得到应该得到的范围。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇