Sma11_Tim3's Studio.

MATLAB使用教程(七)

字数统计: 1.3k阅读时长: 5 min
2020/11/29 Share

做区块链的实验分析的时候,需要使用MATLAB做仿真实验。记录一下相关的教程。本文章转载至https://blog.csdn.net/qq_38431572

前期回顾

上一期中,我们学了下面的知识:

  1. 定积分的基本概念和一些简单的几何意义。
  2. 使用 int 函数计算不定积分。
  3. 使用 int 函数计算定积分。

正文开始

多项式及其建立

在运算中我们经常接触到的就是所谓的多项式,比如很常见的一个多项式:$y=x^2+2x+3$

这里我们就说这是一个x的多项式,最高次是2次,常数项是3,二次项的系数是1,一次项的系数是2,相信这些大家都知道,就不再赘述了。

那么在matlab中,如何建立一个多项式呢?

通过系数建立多项式

如果在演草纸上,我们需要进行如下的步骤:

  1. 确定最高次项是几次。
  2. 确定各个次项的系数。
  3. 常数项是多少。

确定了上面的东西,就基本上可以确定一个多项式了,为了方便,我们使用程序表示这样一个多项式:$y=4x^4+3x^3+2x^2+x+1$,那么上述步骤在程序中是这样表示出来的:

1
2
3
4
5
clc;clear;
%% 使用matlab建立多项式
p = [4 3 2 1 1]; %确定各项系数,和常数项。放在一个数组里面。
y = poly2sym(p); %创建目标多项式,这个函数返回了一个符号变量,即我们的函数
disp(y); %显示y.

PS: 如果需要定义一个特殊的函数比如 $y=4x^4$ ,那么我们可以认为3次、2次、1次系数都为0,常数项也为0,写入数组即可。

上面的程序运行结果如图所示:

image-20201130212913540

通过已知方程的根建立多项式

假设现在已有方程根:$x_1=1,x_2=4$ ,要求得到这个方程的式子,对于一元二次方程来讲,一个方法是:伟达定理,利用根与系数的关系,在matlab中,这种问题也可以得到解决,只需要一个函数即可:

1
2
3
4
5
6
7
clc;clear;
%% 使用根建立多项式
r = [1 2 3]; %随意编一些根
p = poly(r); %调用求多项式的函数
y = poly2sym(p); %得到多项式的符号变量
disp(p);
disp(y);

运行结果如图(我还不知道有没有可能求不出来这个对应方程,没试过哈哈哈哈,我猜应该是只要给出一套根,总能给出一个对应方程吧):

image-20201130213309944

对多项式进行求导

求导即求多项式的导数,一般来讲,习惯上我们把 y = y(x) 对x求导函数直接简称为求导了,但是,我们求导时,一定要明确谁在对谁求导!!!在下文中,不做特殊说明的话,我们默认因变量是y,自变量是x,求导默认为 y对x求导,即求$\frac{dy}{dx}$。

使用matlab进行求导

多项式求导

代码如下:

1
2
3
4
5
6
7
8
9
10
clc; clear;
%% 对多项式进行求导
p = [4 3 2 1 1]; %建立我们的多项式
y = poly2sym(p); %得到多项式的符号变量
temp_str = sprintf('得到多项式:\ny = %s', y); %将式子格式化到一个字符串中
disp(temp_str); %显示
p_1 = polyder(p); %求一次导,注意polyder求导传递的是p而不是y
y_1 = poly2sym(p_1); %转化为符号变量
temp_str = sprintf('求导结果是:\ny_1 = %s\n求导后系数是:[%d %d %d %d]', y_1, p_1);
disp(temp_str);

运行结果如图所示:

image-20201130213540891

乘积求导

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
%% 乘积求导
clc; clear;
p_1 = [4 4 2];
p_2 = [2 4 5]; % 随意胡诌几个数
y_1 = poly2sym(p_1);
y_2 = poly2sym(p_2); % 转化为符号变量
temp_str = sprintf('原来的两个函数为:\n 1. y_1 = %s\n 2. y_2 = %s', y_1, y_2);
disp(temp_str);
res_p = polyder(p_1, p_2); % 乘积求导后的系数
res_y = poly2sym(res_p); %转化为符号变量
temp_str = sprintf('结果为:y = %s', res_y);
disp(temp_str);

商求导

这个部分比较麻烦,商求导后返回值是有两个,因为很有可能出现求导后还是分数的形式,所以返回值是一个分子、一个分母,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%% 商求导
clc; clear;
p_1 = [4 4 2];
p_2 = [2 4 5]; % 随意胡诌几个数
y_1 = poly2sym(p_1);
y_2 = poly2sym(p_2); % 转化为符号变量
temp_str = sprintf('原来的两个函数为:\n 1. y_1 = %s\n 2. y_2 = %s', y_1, y_2);
disp(temp_str);
[res_p_Num, res_p_Den] = polyder(p_1, p_2);
% 注意此处,与乘积求导几乎一样,只是返回值不同,
% 前面的是分子,后面的是分母
res_y_Num = poly2sym(res_p_Num);
res_y_Den = poly2sym(res_p_Den); %转化为符号变量
temp_str = sprintf('结果为:y = (%s)/(%s)', res_y_Num, res_y_Den);
disp(temp_str);

在商求导这个地方,所需要修改的仅仅是返回值而已,其他的地方几乎与乘积求导一致,还是很方便的。

运行结果如图所示:

image-20201130215303214

总结

今天我们学习了如下内容:

  1. 在matlab中使用已知系数、已知根简历方程多项式的方法。
  2. 求导的浅薄的基本概念。
  3. 在matlab中对多项式求导的一些函数,包括一些典型的求导类型:乘积求导、商求导等。

by Covteam-Sma11_Tim3

生活不易,多才多艺。

CATALOG
  1. 1. 前期回顾
  2. 2. 正文开始
    1. 2.1. 多项式及其建立
    2. 2.2. 通过系数建立多项式
    3. 2.3. 通过已知方程的根建立多项式
    4. 2.4. 对多项式进行求导
    5. 2.5. 使用matlab进行求导
      1. 2.5.1. 多项式求导
      2. 2.5.2. 乘积求导
      3. 2.5.3. 商求导
  3. 3. 总结