上一期中,我们学了下面的知识:
本期我打算给大家介绍一下使用matlab对多项式进行的一些基本运算,如求根、求导、四则运算等或者还有其他一些简单的数据分析的内容。
在运算中我们经常接触到的就是所谓的多项式,比如很常见的一个多项式:
这里我们就说这是一个x的多项式,最高次是2次,常数项是3,二次项的系数是1,一次项的系数是2,相信这些大家都知道,就不再赘述了。
那么在matlab中,如何建立一个多项式呢?
如果在演草纸上,我们需要进行如下的步骤:
确定了上面的东西,就基本上可以确定一个多项式了,为了方便,我们使用程序表示这样一个多项式: ,那么上述步骤在程序中是这样表示出来的:
clc;clear;
%% 使用matlab建立多项式
p = [4 3 2 1 1]; %确定各项系数,和常数项。放在一个数组里面。
y = poly2sym(p); %创建目标多项式,这个函数返回了一个符号变量,即我们的函数
disp(y); %显示y.
PS: 如果需要定义一个特殊的函数比如 ,那么我们可以认为3次、2次、1次系数都为0,常数项也为0,写入数组即可。
上面的程序运行结果如图所示:
假设现在已有方程根: ,要求得到这个方程的式子,对于一元二次方程来讲,一个方法是:伟达定理,利用根与系数的关系,在matlab中,这种问题也可以得到解决,只需要一个函数即可:
clc;clear;
%% 使用根建立多项式
r = [1 2 3]; %随意编一些根
p = poly(r); %调用求多项式的函数
y = poly2sym(p); %得到多项式的符号变量
disp(y);
运行结果如图(我还不知道有没有可能求不出来这个对应方程,没试过哈哈哈哈,我猜应该是只要给出一套根,总能给出一个对应方程吧):
求导即求多项式的导数,一般来讲,习惯上我们把 y = y(x) 对x求导函数直接简称为求导了,但是,我们求导时,一定要明确谁在对谁求导!!!在下文中,不做特殊说明的话,我们默认因变量是y,自变量是x,求导默认为 y对x求导,即求 。
PS: 此部分是关于导数的一些基础知识,有相应基础的可以跳过,CSDN右边有目录结构,可以直接根据标题跳转。
导数,在某种程度上,我们可以理解为变化率,即 y 随着 x 的变化而变化的幅度、大小、快慢等,举个例子,我说我的速度是匀速,60km/h(60千米每小时),此时:自变量(x)是时间,因变量(y)是速度,我们可以很清楚的知道,我的速度是匀速(60km/h),所以我的速度(y)不随着时间(x)的变化而变化,所以我的速度变化率是0,所以此时 。在图形上面表示如图所示:
下面假设我的速度不再是匀速,而是慢慢变快的,但是加快的速度是恒定的,都是每分钟加10km/h,比如刚起步是0,一分钟后是10km/h,两分钟后是20km/h.。。。。。类推,此时我们知道,我的速度(因变量y)随着时间(自变量x)是在慢慢改变的(并且还是均匀改变的),所以此时有一个变化率,即 10km/h/min,就是每分钟改变 10km/h的速度,(大家不用理会单位,这个不重要,重要的是知识点),在图形中是这样表示的:
在红色的图形中,就可以看到上面的变化的速度的例子。那么求导数就可以理解为是反映这个变化率的一个方式。
一些基本知识点(u和v都是x的函数,即 u = u(x), v = v(x)。):
理解上述知识点应该就可以理解今天的内容了,如果有什么不懂的,欢迎大家留言或者私信!。
代码如下:
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);
运行结果如图所示:
y_1中的常数1来自于y中的x求导,y中的1求导后成为了0,就没了。
那么,这仅仅是一个多项式求导,乘积求导、商求导,请继续往下看:
乘积求导:
%% 乘积求导
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);
运行结果如图所示:
商求导:
这个部分比较麻烦,商求导后返回值是有两个,因为很有可能出现求导后还是分数的形式,所以返回值是一个分子、一个分母,代码如下:
%% 商求导
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);
在商求导这个地方,所需要修改的仅仅是返回值而已,其他的地方几乎与乘积求导一致,还是很方便的。
运行结果如图所示:
今天我们学习了如下内容:
那么今天就介绍到这里!谢谢大家观看!如果有疑问,欢迎大家评论留言!