octave中符号计算需要额外安装symbolic库,下面是安装方法,不安装无法使用
https://blog.csdn.net/weixin_39956356/article/details/106732134
目录
1 octave符号计算简介
octave主要科学计算有两大类,数值计算和符号计算,今天这里分享的是符号计算,语法和MATLAB很像,或者说连参数完全一致。但是不能认为octave是MATLAB的盗版,octave是GNU的开源项目,代码开源,为了让MATLAB使用者不会感到有太大差距,也仿着做了octave。MATLAB在93年收购了Maple,在此基础上设计了符号工具箱,可以认为MATLAB是行业领先者,是行业的标准,而octave遵循这个标准,完成开发,有些地方比MATLAB做的还更有意思。
我写了注意的是octave和MATLAB有差别的地方
下面简单介绍两个概念,这里只是泛泛的讲,方便理解
- 符号:可以认为是在作业本上写的 x y z x\; y \;z xyz,比如常常见到的化简题目,一直化简,最后才带值计算
- 变量:在计算过程中是已知的,比如 x = 1 y = 2 x=1\;y=2 x=1y=2
1.1 符号计算及符号表达式的创建
有两种创建方式,不过第二种方式更常用
第一种:一次只能创建一个
符号量名(不给默认ans) = sym(符号字符串)
>> b = sym('b')
b = (sym) b
第二种:一次可以创建多个,注意中间不要用逗号
syms a b c d
符号表达式,这里分享最常用最容易理解的一种,即用已经定义的符号变量组成的表达式
# 一个求长方体体积的表达,生成的V自然而然的是符号变量
>> syms x y z
>> V = x*y*z
V = (sym) x*y*z
1.2 基本的符号运算
1.2.1 符号表达式的四则运算
基本的运算就是 +,-,*,/,^
比如两个多项式乘法,显示很友好,就像手写的一样
x 2 − x + 7 x^2 - x + 7 x2−x+7和 2 ∗ x 2 + 3 ∗ x − 5 2*x^2 + 3*x - 5 2∗x2+3∗x−5相乘
>> f = x^2 - x + 7
f = (sym)
2
x - x + 7
>> g = 2*x^2 + 3*x - 5
g = (sym)
2
2*x + 3*x - 5
>> f * g
ans = (sym)
/ 2 \ / 2 \
\x - x + 7/*\2*x + 3*x - 5/
1.2.2 符号表达式的提取分子,分母
注意:numden
在octave没有像MATLAB那样化简
>> f = (x^2+3)/(2*x+1) + 3*x/(x-1)
f = (sym)
2
3*x x + 3
----- + -------
x - 1 2*x + 1
>> [n, d] = numden(f)
n = (sym)
2
3*x x + 3
----- + -------
x - 1 2*x + 1
d = (sym) 1
1.2.3 因式分解和展开
因式分解factor
, 如
a
3
−
b
3
a^3 - b^3
a3−b3
>> A = a^3 - b^3
A = (sym)
3 3
a - b
>> factor(A)
ans = (sym)
/ 2 2\
(a - b)*\a + a*b + b /
再举个例子,240的分解如下
>> factor(sym('240'))
ans = (sym)
4 1 1
2 *3 *5
因式展开expand
, 如上
f
∗
g
f*g
f∗g
>> expand(f*g)
ans = (sym)
4 3 2
2*x + x + 6*x + 26*x - 35
注意:collect
在octave中没有,含义是按某个字母合并同类项
1.2.4 符号表达式化简
符号表达式化简simplify
, 如化简
(
x
2
+
y
2
)
2
+
(
x
2
−
y
2
)
2
(x^2+y^2)^2 + (x^2-y^2)^2
(x2+y2)2+(x2−y2)2
注意:simple
在octave中没有,MATLAB也弃用了
>> s = (x^2+y^2)^2 + (x^2-y^2)^2
s = (sym)
2 2
/ 2 2\ / 2 2\
\x - y / + \x + y /
>> simplify(s)
ans = (sym)
4 4
2*x + 2*y
1.2.5 符号表达式与数值表达式的转化
如数值表达式3.14转成符号表达式
>> sym(3.14)
warning: passing floating-point values to sym is dangerous, see "help sym"
warning: called from
double_to_sym_heuristic at line 50 column 7
sym at line 379 column 13
ans = (sym)
157
---
50
注意:有警告,不能传入浮点数,解决办法有两种,下面两种都可以
>> sym(314)/100
>> sym(3.14, 'r')
如符号表达式3.14转成数值
>> phi = '(1+sqrt(5))/2'
phi = (1+sqrt(5))/2
>> eval(phi)
ans = 1.6180
2 符号表达式默认C位变量
比如长方体体积的表达V = x*y*z
,我们想知道里面的有几个符号变量,谁是C位?,为什么要知道谁是C位了(最核心的变量呢?),比如在求导,积分中默认是对C位变量求导,积分。除非指定其他变量
规定:离字母x最近的为C位变量。这里就是x了
>> findsym(V) # 一共有三个符号变量
ans = x,y,z
>> findsym(V, 1) # C位变量
ans = x
2.1 符号矩阵
数值计算关于矩阵的都可以用,不过结果是表达式而已。 比如求行列式的值det,秩rank,迹trace,上下三角矩阵tril,triu,
>> A = [sin(x) cos(x); acos(x) asin(x)]
A = (sym 2x2 matrix)
[sin(x) cos(x) ]
[ ]
[acos(x) asin(x)]
>> det(A)
ans = (sym) sin(x)*asin(x) - cos(x)*acos(x)
3 看一个例子
求
λ
\lambda
λ使得齐次线性方程组有非零解
{
(
1
−
λ
)
x
1
−
2
x
2
+
4
x
3
=
0
2
x
1
+
(
3
−
λ
)
x
2
+
x
3
=
0
x
1
+
x
2
+
(
1
−
λ
)
x
3
=
0
\begin{cases} (1-\lambda)x_1-2x_2+4x_3 = 0 \\ 2x_1+(3-\lambda)x_2 + x_3 = 0 \\ x_1 + x_2 + (1-\lambda)x_3 = 0 \end{cases}
⎩⎪⎨⎪⎧(1−λ)x1−2x2+4x3=02x1+(3−λ)x2+x3=0x1+x2+(1−λ)x3=0
>> syms lambda
>> A = [1-lambda -2 4; 2 3-lambda 1; 1 1 1-lambda]
A = (sym 3x3 matrix)
[1 - lambda -2 4 ]
[ ]
[ 2 3 - lambda 1 ]
[ ]
[ 1 1 1 - lambda]
>> factor(det(A))
ans = (sym) -lambda*(lambda - 3)*(lambda - 2)
结果就是0, 2, 3.
4 总结
符号计算:更像是进行推导证明,结果是很精确的,而且octave输出很友好
数值计算:得到结果的一个有限小数,当然有些问题只有数值计算才能解决。
如有问题请留言。