MATLAB使用速成 第七章(多项式运算与代数方程求解)

一、多项式运算

1、多项式的表示方法

(1)在MATLAB中,n次多项式用一个长度为n+1的向量来表示。

(2)多项式与符号表达式的互化:

①语句“poly2sym(x)”可将多项式x转化为符号表达式。

②语句“sym2poly(f)”可将符号表达式f转化为多项式。

2、四则运算

(1)加减运算:

①MATLAB没有提供专门进行多项式加减运算的函数,多项式的加减就是其所对应的系数向量的加减运算。

②次数相同的多项式,可直接对其系数向量进行加减运算;如果两个多项式次数不同,则应该把低次多项式中系数不足的高次项用0补足,然后再进行加减运算。

(2)乘法运算:

        语句“k=conv(p,q)”可将多项式p和q相乘的结果存放在k中。

(3)除法运算:

        语句“[k,r]=deconv(p,q)”可将多项式p除以q的商存放在k中,余式存放在r中。

3、导数与积分

(1)多项式求导:

(2)多项式积分:

4、求值与零点

(1)多项式求值:语句“polyval(p,x)”可计算多项式p在x点的值,这里的x可以是向量或矩阵,如果是向量或矩阵则采用的是相应的数组运算,也就是每个元素分别代入p中进行求值,返回一个同等大小的向量或矩阵。

(2)矩阵多项式求值:语句“polyvalm(p,A)”可计算多项式p作用在矩阵A上的值,这里的A必须是方阵,且采用的是普通矩阵运算,也就是线性代数中的矩阵运算。

(3)多项式的零点:

①语句“roots(p)”可计算多项式p的所有零点,返回一个由p的所有零点组成的向量。

②若已知多项式的全部零点,则可用poly函数给出该多项式。

二、代数方程求解

1、线性方程组求解

        语句“linsolve(A,b)”可求解线性方程组Ax = b,其中右端项b是列向量,由各方程右侧的常数项组成,A为各方程的各次项系数组成的矩阵。

2、非线性方程求解

        当多项式的次数大于1时,其对应的方程为非线性方程,可用命令fzero进行求解。

        ①方程可能有多个根,但fzero只给出x0附近的一个;或者f(x)=0在[a,b]内可能有多个解,但fzero也只给出一个。

        ②fzero先找出一个包含x0的区间,使得f在这个区间的两个端点上的函数值异号,然后再在这个区间内寻找方程f(x)=0 的解;如果找不到这样的区间,则返回NaN。

        ③由于fzero是根据函数是否穿越横轴来决定零点,因此它无法确定函数曲线仅触及横轴但不穿越的零点。

        ④参数f是一个函数句柄,可由匿名函数、内联函数、字符串及函数文件的方式给出。(需要注意的是,不能使用符号表达式)

### MATLAB 中将字符表达式转换为变量表达式的实现 在 MATLAB 中,可以通过 `eval` 函数来完成从字符串到变量表达式的转换。此函数会解析并执行作为输入参数传递的字符串中的有效 MATLAB 表达式[^1]。 以下是具体方法: #### 使用 eval 实现字符串转变量 通过定义一个字符串形式的表达式,并将其传入 `eval` 函数,可以动态计算该表达式的值。例如: ```matlab expression = '2 + 3'; % 字符串形式的表达式 result = eval(expression); % 将字符串表达式转化为实际运算 disp(result); % 输出结果应为 5 ``` 需要注意的是,在使用 `eval` 的过程中可能会引入安全性和性能方面的问题,因此建议仅在必要时谨慎使用它[^4]。 另外,当需要创建或操作由名称组成的多个变量时,也可以利用类似的技巧结合字符串拼接功能一起工作。比如下面的例子展示了如何基于字符串构建新的变量名以及赋值过程: ```matlab baseName = 'var'; for i = 1:3 varName = sprintf('%s%d', baseName, i); command = sprintf('%s = rand(1)', varName); eval(command); end whos var* ``` 上述代码片段中,循环迭代三次分别生成名为 `var1`, `var2`, 和 `var3` 的随机数向量。 尽管如此,推荐更现代的方式处理这类需求——即采用结构体或者元胞数组存储数据而不是单独命名许多相似作用域内的简单变量[^3]。 #### 结合melody示例说明 考虑如下情况下的应用实例: 给定一段旋律表示法如引用所展示的内容, 我们可以尝试读取这些模式并通过适当变换重现出来。 这里假设每个音符对应特定图形符号,则可编写相应脚本绘制图案[^2]: ```matlab str = 'rududdrudud'; melody = {'*' '*' '/' '\' '-' '*' '*' '*' '*' '*' '\'' '/' '\' '-' '*'}; figure; hold on; currentYPos = 0; for k = 1:length(str) switch str(k) case 'r' currentYPos = currentYPos + 1; case 'u' plot([k-1,k],[currentYPos,currentYPos+1],'b'); currentYPos = currentYPos + 1; case 'd' plot([k-1,k],[currentYPos,currentYPos-1],'g'); currentYPos = currentYPos - 1; otherwise text(k-.5 ,currentYPos,melody{mod(currentYPos,length(melody))+1}); end end axis ij; grid off; title('Melodic Pattern Representation'); xlabel('Time Step'); ylabel('Pitch Level'); hold off; ``` 以上程序段按照指定规则解释输入序列并绘图显示其对应的视觉效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值