实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题

Posted 文宇肃然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题相关的知识,希望对你有一定的参考价值。

前言

 

关于MATLAB系列的精品专栏大家可参见

MATLAB-30天带你从入门到精通

MATLAB深入理解高级教程(附源码)

喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!

系列文章第一篇

实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(一)

高等应用数学问题(001)

今日操作题:

 

启动MATLAB环境,并给出语句:

 

tic,A=rand(500);B=inv(A);norm(A*B-eye(500)),toc,

 

试运行该语句,观察得出的结果,并利用 help命令对你不熟悉的语句进行帮助信息查 询,逐条给出上述程序段与结果的解释。

 

回答以下问题:

 

1、tic,toc

 

  • 是干什么的?

  •  

  • 必须成对出现吗?

  •  

  • 他们的作用是什么?

  •  

  • 什么时候需要加入这两条语句?

 

2、看看 rand、inv、norm、eye 这四个函数的帮助文件?

 

3、比较两端程序计算时间,并将它们的时间存到一个数组中。

 

 

 

【解】 

 

在 MATLAB 环境中实践体会如下语句:

 

  • 1、求解 500 × 500 随机矩阵的逆,

  • 2、求得出的逆矩阵与原矩阵的乘积,

  • 3、求2之结果和单位矩阵的差,并求其范数。

 

一般来说,这样得出的精度可以达到 10^−12。

 

>> tic, A=rand(500); B=inv(A); norm(A*B-eye(500)), toc 

 

ans =

1.2333e-012

 

Elapsed time is 1.301000 seconds.

 

提示:问题1

  • Matlab里面的计时函数:

    主要有tic,toc,cputime和etime等,计时函数可以定量地计算完成指定程序所消耗的cpu时间资源,可以作为比较程序优劣的一个参数。

  • tic和toc函数必须成对出现,配合使用,tic表示计时的开始,toc表示计时的结束。

  • 格式如:

     

    tic

    任意表达式

    toc

     

    t=toc

     

  • cputime函数

    cputime函数返回从调用该函数起所用的总的cpu时间,单位以秒计算。

  • 格式如:

     

    t=cputime;

     

    任意表达式或者程序

     

    e=cputime-t;

     

  • etime函数

    e=etime(t2,t1)命令返回向量t1和t2之间的时间段,t1和t2必须含有由clock函数返回的6个元素;

  • 即:[Year Month Day Hour Minute Second]。

 

提示:问题2

  • rand、生成随机数

  • inv、求逆

  • norm、求范数

  • eye、生成单位矩阵

 

提示:问题3

 

可记录两段程序返回的时间t1和t2,T=[t1,t2]即可。

高等应用数学问题(002)

 

用 MATLAB 语句输入矩阵 A 和 B 矩阵:

图片

前面给出的 A 是 4 × 4 矩阵,如果给出 A(5, 6) = 5 命令,将得出什么结果?

 

进一步在此基础上给出A(:,5)=[] 命令,将得出什么结果?

 

 

 

【解】 

直接输入这两个矩阵:

 

>> A=[1  2  3  4; 4  3  2  1; 2  3  4  1; 3  2  4  1] 

 

图片

若给出 A(5,6)=5 命令,虽然这时的行和列数均大于 B 矩阵当前的维数,但仍然可以执行该语句,

 

>> A(5,6)=5 

 

得出:

 

图片

进一步在此基础上给出A(:,5)=[] 命令,将把上面的矩阵中第5列删除:

 

>> A(:,5)=[] 

 

图片

复数矩阵也可以用直观的语句输入:

 

>> B=[1+4i 2+3i 3+2i 4+1i; 4+1i 3+2i  2+3i 1+4i; 2+3i  3+2i  4+1i  1+4i;  3+2i  2+3i 4+1i 1+4i];

 

图片

高等应用数学问题(003)

 

用数值方法可以求出

图片

试不采用循环的形式求出和式的数值解。

 

由于数值方法采用 double 形式进行计算的,难以保证有效位数字,所以结果

不一定精确。试采用符号运算的方法求该和式的精确值。

 

 

 

【解】 用符号运算的方式可以采用下面语句

 

>> sum(sym(2).^[1:63]) 

 

ans =

18446744073709551614

 

由于结果有 19 位数值,所以用 double 型不能精确表示结果,该数据类型最多表示 16 位有效 数字。

 

其实用符号运算方式可以任意保留有效数字。

 

例如,可以求 200 项的和或 1000 项的和可以由下面语句立即得出。

 

>> sum(sym(2).^[1:200]) 

 

ans =

3213876088517980551083924184682325205044405987565585670602750

 

>> sum(sym(2).^[1:1000]) 

 

ans =

214301721437253464189685009812000362112280962341106721488750077674070

210224987224498639675763139171625518934583510629365037429057138462808

719691551493971496078691355496484619708421492101247422837559083643060

929499671638825347975351183310878921541258291423929553730843353208596

63305248773674411336138750

 

 

关于求和函数sum:

>> help sum

 sum Sum of elements.

 

S = sum(X) is the sum of the elements of the vector X. 

If X is a matrix, S is a row vector with the sum over each column. For N-D arrays, sum(X) operates along the first non-singleton dimension.

 

S = sum(X,'all') sums all elements of X.

S = sum(X,DIM) sums along the dimension DIM.

S = sum(X,VECDIM) operates on the dimensions specified in the vector VECDIM. For example, sum(X,[1 2]) operates on the elements contained in  the first and second dimensions of X.

S = sum(...,TYPE) specifies the type in which the sum is performed, and the type of S. 

 

Available options are:

'double'    -  S has class double for any input X

'native'    -  S has the same class as X

'default'   -  If X is floating point, that is double or single, S has the same class as X. If X is not floating point, S has class double.

 

S = sum(...,NANFLAG) specifies how NaN (Not-A-Number) values are treated. 

The default is 'includenan': 

'includenan' - the sum of a vector containing NaN values is also NaN.

'omitnan'    - the sum of a vector containing NaN values is the sum of all its non-NaN elements. If all elements are NaN, the result is 0.

 

Examples:

X = [0 1 2; 3 4 5]

sum(X, 1)

sum(X, 2)

 

X = int8(1:20)

sum(X)  % returns double(210), accumulates in double

sum(X,'native') % returns int8(127), 

% because it accumulates in int8 but overflows and saturates.

高等应用数学问题(004)

 

用 MATLAB 语言实现下面的分段函数 

图片

 

 

【解】 

两种方法,

其一,巧用比较表达式解决

 

y=h*(x>D) + h/D*x.*(abs(x)<=D) -h*(x<-D);

 

另外一种方法,用循环语句和条件转移语句

for  i=1:length(x)

if x(i)>D, y(i)=h;

elseif abs(x(i))<=D, y(i)= h/D*x(i); 

else, y(i)=-h; end

end

 

其中,

  • 前者语句结构简单,但适用范围更广,允许使用矩阵型 x;

  • 后者只能使用向量型的 x,但不能处理矩阵问题。

 

 

提示:

关于if语句的使用:

>> help if

if Conditionally execute statements. 

 

The general form of the if statement is

 

if expression

         statements

elseif expression

         statements

else

         statements

end

 

The statements are executed if the real part of the expression has all non-zero elements. 

 

The else and elseif parts are optional. 

 

Zero or more elseif parts can be used as well as nested if's.

 

The expression is usually of the form expr rop expr where rop is ==, <, >, <=, >=, or ~=.

 

Example

if I == J

         A(I,J) = 2;

elseif abs(I-J) == 1

         A(I,J) = -1;

else

         A(I,J) = 0;

end

 

关于else语句的使用:   

Used with if.

else is used with if.  

 

The statements after the else are executed if all the preceding if and elseif expressions are false.

 

The general form of the if statement is

      

if expression

         statements

elseif expression

         statements

else

end

高等应用数学问题(005)

编写一个矩阵相加函数 mat_add(),使其具体的调用格式为 

 

A=mat_add(A1,A2,A3,· · · ), 

 

要求该函数能接受任意多个矩阵进行解法运算。

 

 

【解】 

可编写下面的函数mat_add.m,

 

用 varargin  变量来表示可变输入变量。

function A=mat_add(varargin) A=0;

for  i=1:length(varargin),  

      A=A+varargin{i}; 

end

 

如果想得到合适的错误显示,则可以试用 try, catch 结构。 

function A=mat_add(varargin)

try

A=0;

for i=1:length(varargin), 

A=A+varargin{i}; 

end 

catch,  

error(lasterr);  

end

 

 

关于try:

>> help try

try  Begin try block.

The general form of a try statement is:

  

try

          statement, ..., statement, 

catch me

          statement, ..., statement 

end

 

Normally, only the statements between the try and catch are executed. However, if an error occurs while executing any of the statements, theerror is captured into an object, me, of class MException, and the statements between the catch and end are executed. If an error occurs within the catch statements, execution stops, unless caught by another try...catch block. 

 

The me argument is optional. 

 

 

关于catch:

Begin catch block.

 

The general form of a TRY statement is:

 

try

          statement, ..., statement, 

catch me

          statement, ..., statement 

end

 

Normally, only the statements between the try and catch are executed. However, if an error occurs while executing any of the statements, the  error is captured into an object, me, of class MException, and the statements between the catch and end are executed. If an error occurs within the catch statements, execution stops, unless caught by another try...catch block. 

 

The me argument is optional. 

高等应用数学问题(006)

 

自己编写一个 MATLAB 函数,

 

使它能自动生成一个 m × m 的 Hankel 矩阵,

并使其调用格式为:

v=[h1, h2, hm, hm+1, · · · , h2m−1];  

H=myhankel(v)。

 

 

 

【解】 

解决这样的问题可以有多种方法:

 

①最直接的方法,Hi,j  = hi+j−1,利用双重循环

function H=myhankel(v)

m=(length(v)+1)/2; % 严格说来还应该判定给定输入向量长度奇偶性

for i=1:m, 

     for j=1:m 

          H(i,j)=v(i+j-1);

     end,

end

 

②考虑某一行 (或列),ai  = [hi, hi+1, · · · , hi+m−1],就可以用单重循环生成 Hankel 矩阵了

function H=myhankel(v)

m=(length(v)+1)/2; % 严格说来还应该判定给定输入向量长度奇偶性

for  i=1:m,  H(i,:)=v(i:i+m-1); end

 

③利用现有的 hankel() 函数,则 

function H=myhankel(v)

m=(length(v)+1)/2; % 严格说来还应该判定给定输入向量长度奇偶性

H=hankel(v(1:m),v(m:end));

 

以上是关于实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题的主要内容,如果未能解决你的问题,请参考以下文章

适合自己的才是最好的

学习Linux系统的方法有很多,适合自己的才是最好

CAP理论,适合的才是最好的

前端开发工具趋势,合适你的才是最好的

国内几个免费CDN对比,适合你的才是最好的

学习Linux系统的方法有很多,适合自己的才是最好。