Maxima导引:修订间差异

来自Ubuntu中文
跳到导航跳到搜索
Bones7456留言 | 贡献
修改格式
 
(未显示4个用户的8个中间版本)
第5行: 第5行:
Maxima: http://wiki.ubuntu.org.cn/Maxima
Maxima: http://wiki.ubuntu.org.cn/Maxima


==函数==
== 函数 ==
===定义函数===


注意函数使用的符号是 :=
=== 定义函数 ===


====一元函数====
注意函数使用的符号是 :=
 
==== 一元函数 ====


  f(x):=expr;
  f(x):=expr;
第17行: 第18行:


  (%i1) f(x):= 1+x;
  (%i1) f(x):= 1+x;
  (%o1)                           f(x) := 1 + x
  (%o1) f(x) := 1 + x
  (%i2) f(2);
  (%i2) f(2);
  (%o2)                                 3
  (%o2) 3


====多元函数====
==== 多元函数 ====


  f(x,y):=expr;
  f(x,y):=expr;
第28行: 第29行:


  (%i3) f(x,y):=y^2+x^2;
  (%i3) f(x,y):=y^2+x^2;
                                          2   2
  2 2
  (%o3)                         f(x, y) := y + x
  (%o3) f(x, y) := y + x
  (%i4) f(2,3);
  (%i4) f(2,3);
  (%o4)                                 13
  (%o4) 13
 
=== 初等函数 ===
 
;幂函数: x^2, x^(-1/2),...;指数函数:2^x, (1/2)^x, exp(x), %e^x...:在 maxima 中,常数e=2.718281828459045被记为:%e. 所以指数函数 e^x 在 maxima 中被表示为:%e^x


===初等函数===
;幂函数: x^2, x^(-1/2),...
;指数函数:2^x, (1/2)^x, exp(x), %e^x...
:在 maxima 中,常数e=2.718281828459045被记为:%e. 所以指数函数 e^x 在 maxima 中被表示为:%e^x
由于这个函数的重要性,它有一个专门的记法:exp(x).
由于这个函数的重要性,它有一个专门的记法:exp(x).


  (%i2)f(x) := %e^x;
  (%i2)f(x) := %e^x;
                                            x
                                    x
  (%o2)                             f(x) := %e
  (%o2) f(x) := %e
  (%i3)g(x) := exp(x);
  (%i3)g(x) := exp(x);
  (%o3)                           g(x) := exp(x)
  (%o3) g(x) := exp(x)
  (%i4)expand(f(x) - g(x));
  (%i4)expand(f(x) - g(x));
  (%o4)                                 0
  (%o4) 0
 
;对数函数:log(x):在 maxima 中,log(x) 就是自然对数,即以 e 为底的对数,数学上常记为 ln(x)。maxima 没有其它形式的对数,要使用以 10 或 2 为底的对数,只能使用换底公式。如果把下面的代码放到 ~/.maxima/maxima-init.mac 中,则 maxima 在运行时会加载自定义函数 log10、log2,并把 ln 定义为 log。这样就可以使用 log10、log2 和 ln 了。


;对数函数:log(x)
:在 maxima 中,log(x) 就是自然对数,即以 e 为底的对数,数学上常记为 ln(x)。maxima 没有其它形式的对数,要使用以 10 或 2 为底的对数,只能使用换底公式。如果把下面的代码放到 ~/.maxima/maxima-init.mac 中,则 maxima 在运行时会加载自定义函数 log10、log2,并把 ln 定义为 log。这样就可以使用 log10、log2 和 ln 了。
  log10(x):=log(x)/log(10);
  log10(x):=log(x)/log(10);
  log2(x):=log(x)/log(2);
  log2(x):=log(x)/log(2);
  ln:log;  
  ln:log;  


;三角函数:sin, cos, tan, cot, sec, csc
;三角函数:sin, cos, tan, cot, sec, csc:在 maxima 中,pi=3.141592653589793 被记为 %pi.
:在 maxima 中,pi=3.141592653589793 被记为 %pi.
;反三角函数:asin, acos, atan, acot, asec, acsc
;反三角函数:asin, acos, atan, acot, asec, acsc


===分段函数===
=== 分段函数 ===


  f(x)= x-1, x<0
  f(x)= x-1, x&lt;0
      0,   x=0
  0, x=0
      x+1, x>0
  x+1, x&gt;0


  (%i2) f(x) := if x < 0 then x - 1 else (if x = 0 then 0 else 1 + x);
  (%i2) f(x)&nbsp;:= if x &lt; 0 then x - 1 else (if x = 0 then 0 else 1 + x);
  (%o2)   f(x) := if x < 0 then x - 1 else (if x = 0 then 0 else 1 + x)
  (%o2) f(x)&nbsp;:= if x &lt; 0 then x - 1 else (if x = 0 then 0 else 1 + x)
  (%i3) f(- 1);
  (%i3) f(- 1);
  (%o3)                                 - 2
  (%o3) - 2
  (%i4) f(0)
  (%i4) f(0)
  (%o4)                                 0
  (%o4) 0
  (%i5) f(1)
  (%i5) f(1)
  (%o5)                                 2
  (%o5) 2
 
== 极限 ==


==极限==
求极限的命令为:
求极限的命令为:


  limit (expr, var, val, direction);
  limit (expr, var, val, direction);


<br> expr 是要求极限的表达式; var 是变量名; val 指定在何处取极限;direction 是方向,可以是 plus 和 miuns,分别指右极限和左极限。


expr 是要求极限的表达式; var 是变量名; val 指定在何处取极限;direction 是方向,可以是 plus 和 miuns,分别指右极限和左极限。
<br> 例子:
 
 
例子:


  (%i2)limit (sin(x)/x, x, 0);
  (%i2)limit (sin(x)/x, x, 0);
  (%o2)                           1
  (%o2) 1
  (%i3)limit (tan(x), x, %pi/2);
  (%i3)limit (tan(x), x, %pi/2);
  (%o3)                         und
  (%o3) und
  (%i4)f:diff(abs(x), x);
  (%i4)f:diff(abs(x), x);
  (%i5)limit(f, x, 0, plus);
  (%i5)limit(f, x, 0, plus);
  (%o5)                           1
  (%o5) 1
  (%i6)limit(f, x, 0, minus);
  (%i6)limit(f, x, 0, minus);
  (%o6)                         -1
  (%o6) -1
   
   
   
   
其中 und 表示极限不存在。
其中 und 表示极限不存在。


如果要取无穷处的极限,可以用常数 inf, minf。前者表示正无穷,后者表示负无穷。
如果要取无穷处的极限,可以用常数 inf, minf。前者表示正无穷,後者表示负无穷。


  (%i1) limit (1/x, x, inf);
  (%i1) limit (1/x, x, inf);
  (%o1)                           0
  (%o1) 0
  (%i2) limit (atan(x), x, inf);
  (%i2) limit (atan(x), x, inf);
  (%o2)                         %pi/2
  (%o2) %pi/2
  (%i3) limit (atan(x), x, minf);
  (%i3) limit (atan(x), x, minf);
  (%o3)                         -%pi/2
  (%o3) -%pi/2


== 导数 ==
== 导数 ==


求导数:
求导数:
<pre>diff(expr, var)</pre>  
 
<pre>diff(expr, var)</pre>
 
例子:
例子:
 
<pre>
  (%i1) diff(sin(x),x);
  (%i1) diff(sin(x),x);
  (%o1) cos(x)
  (%o1) cos(x)
第117行: 第120行:
  (%o2) f(x) (-- (g(x))) + g(x) (-- (f(x)))
  (%o2) f(x) (-- (g(x))) + g(x) (-- (f(x)))
             dx                dx
             dx                dx
</pre>


<br> 求高阶导数:
求高阶导数:


diff(expr, var, n)  
<pre>diff(expr, var, n)</pre>


<br> 例子:


例子:
<pre>
  (%i3)diff(sin(x),x, 2);
  (%i3)diff(sin(x),x, 2);
  (%o3) - sin(x)
  (%o3) - sin(x)
  (%i4) diff(f(x)*g(x),x,3);
  (%i4) diff(f(x)*g(x),x,3);
            3                            2
              3                            2
            d                d          d
            d                d          d  
(%o4) f(x) (--- (g(x))) + 3 (-- (f(x))) (--- (g(x)))
(%o4) f(x) (--- (g(x))) + 3 (-- (f(x))) (--- (g(x)))
              3              dx            2
              3              dx            2
            dx                          dx
            dx                          dx
                                      2                              3
                                    2                              3
                                    d            d                  d
                                    d            d                  d
                                + 3 (--- (f(x))) (-- (g(x))) + g(x) (--- (f(x)))
                              + 3 (--- (f(x))) (-- (g(x))) + g(x) (--- (f(x)))
                                      2          dx                  3
                                      2          dx                  3
                                    dx                              dx
                                    dx                              dx
</pre>


==集合==
== 集合 ==
===集合定义===
 
=== 集合定义 ===


maxima 似乎只支持有限集。建立集合的方式是列举。
maxima 似乎只支持有限集。建立集合的方式是列举。


;set(a_1, ..., a_n)
;set(a_1, ..., a_n):n 个元素的集合
:n 个元素的集合
;{a_1, ..., a_n}:同上
;{a_1, ..., a_n}
;setify(foo):list-&gt;set
:同上
;setify(foo):list->set
:把列表 foo 转换为集合
:把列表 foo 转换为集合
;fullsetify(foo)
;fullsetify(foo):把列表 foo 转换为集合, 对列表的列表元素递归调用 fullsetify。列表的列表元素指的是:列表的一个元素,本身又是一个列表。
:把列表 foo 转换为集合, 对列表的列表元素递归调用 fullsetify。列表的列表元素指的是:列表的一个元素,本身又是一个列表。


例子:
例子:


  (%i2) A : set(1, 2, 3)
  (%i2) A&nbsp;: set(1, 2, 3)
  (%o2)                   {1, 2, 3}
  (%o2) {1, 2, 3}
  (%i3) B : {a, b, c}
  (%i3) B&nbsp;: {a, b, c}
  (%o3)                   {a, b, c}
  (%o3) {a, b, c}
  (%i4) C : {}
  (%i4) C&nbsp;: {}
  (%o4)                       {}
  (%o4) {}


  (%i2) setify([a, b, c])
  (%i2) setify([a, b, c])
  (%o2)                   {a, b, c}
  (%o2) {a, b, c}
  (%i3) setify([a, b, [1, 2], [a, b, c]])
  (%i3) setify([a, b, [1, 2], [a, b, c]])
  (%o3)               {[1, 2], a, [a, b, c], b}
  (%o3) {[1, 2], a, [a, b, c], b}


  (%i2) fullsetify([a, b, [1, 2], [a, b, c]])
  (%i2) fullsetify([a, b, [1, 2], [a, b, c]])
  (%o2)               {{1, 2}, a, {a, b, c}, b}
  (%o2) {{1, 2}, a, {a, b, c}, b}


<br>


===元素与集合===
=== 元素与集合 ===
 
;elementp(x,y):判断 x 是否集合 S 的元素
;adjoin(x, S):返回集合 {t | (t in S) or t = x} 即返回把 x 添加到 S 中得到的集合,但 S 本身并不改变。
;disjoin(x, S):返回把 x 从集合 S 中去除後的集合,S 本身并不改变。


;elementp(x,y)
:判断 x 是否集合 S 的元素
;adjoin(x, S)
:返回集合 {t | (t in S) or t = x} 即返回把 x 添加到 S 中得到的集合,但 S 本身并不改变。
;disjoin(x, S)
:返回把 x 从集合 S 中去除后的集合,S 本身并不改变。
 
例子:
例子:
  (%i2) A : {a, b, c}
 
  (%o2)                   {a, b, c}
  (%i2) A&nbsp;: {a, b, c}
  (%o2) {a, b, c}
  (%i3) elementp(a, A)
  (%i3) elementp(a, A)
  (%o3)                     true
  (%o3) true
  (%i4) elementp(d, A)
  (%i4) elementp(d, A)
  (%o4)                     false
  (%o4) false
   
   
  # 把 d 添加到 A 中
  # 把 d 添加到 A 中
  (%i5) adjoin(d, A)
  (%i5) adjoin(d, A)
  (%o5)                 {a, b, c, d}
  (%o5) {a, b, c, d}
   
   
  # A 并未改变,d 不是 A 的元素
  # A 并未改变,d 不是 A 的元素
  (%i6) elementp(d, A)
  (%i6) elementp(d, A)
  (%o6)                     false
  (%o6) false
   
   
  # 把 d 添加到 A 中,并把得到的集合赋值给 A
  # 把 d 添加到 A 中,并把得到的集合赋值给 A
  (%i7) A : adjoin(d, A)
  (%i7) A&nbsp;: adjoin(d, A)
  (%o7)                 {a, b, c, d}
  (%o7) {a, b, c, d}
   
   
  (%i8) elementp(d, A)
  (%i8) elementp(d, A)
  (%o8)                     true
  (%o8) true
  (%i9) A : disjoin(a, A)
  (%i9) A&nbsp;: disjoin(a, A)
  (%o9)                   {b, c, d}
  (%o9) {b, c, d}
  (%i10) elementp(a, A)
  (%i10) elementp(a, A)
  (%o10)                     false
  (%o10) false


===集合运算===
=== 集合运算 ===


;emptyp(S)
;emptyp(S):判断 S 是否空集
:判断 S 是否空集  
;intersection(A, B):交
;intersection(A, B)
;intersect(A, B):同上,似乎无任何区别
:交
;union (A, B):并
;intersect(A, B)
;setdifference(A, B):差,馀。 A\B
:同上,似乎无任何区别
;symmdifference(A,B):对称差
;union (A, B)
;subsetp(A,B):判断 A 是否 B 的子集
:并  
;subset(A, f):返回集合 {x | (x in A) and (f(x)=true)} f 必须是谓词函数,也即其值域为 {true, false}。
;setdifference(A, B)
;subset (A, f):返回一个 A 的一个子集合,由 A 中满足 f 的元素全体组成。
:差,余。 A\B
;powerset(A):返回 A 的全部子集合构成的集合。
;symmdifference(A,B)
;powerset(A,n):返回 A 的大小为 n 的子集构成的集合。
:对称差
;cartesian_product(A,B):返回 A, B 的笛卡尔积(直积)。
;subsetp(A,B)
;cardinality:返回集合 A 的大小|A|。
:判断 A 是否 B 的子集
;disjointp(A,B):若集合 A, B 相交,则返回 false,否则返回 true。
;subset(A, f)
:返回集合 {x | (x in A) and (f(x)=true)} f 必须是谓词函数,也即其值域为 {true, false}。
;subset (A, f): 返回一个 A 的一个子集合,由 A 中满足 f 的元素全体组成。
;powerset(A)
:返回 A 的全部子集合构成的集合。
;powerset(A,n)
:返回 A 的大小为 n 的子集构成的集合。
;cartesian_product(A,B)
:返回 A, B 的笛卡尔积(直积)。
;cardinality
:返回集合 A 的大小|A|。
;disjointp(A,B)
:若集合 A, B 相交,则返回 false,否则返回 true。


例子:
例子:
  (%i2) A : {a, b, c}
 
  (%o2)                   {a, b, c}
  (%i2) A&nbsp;: {a, b, c}
  (%i3) B : {b, c, d}
  (%o2) {a, b, c}
  (%o3)                   {b, c, d}
  (%i3) B&nbsp;: {b, c, d}
  (%o3) {b, c, d}
  (%i4) intersection(A, B)
  (%i4) intersection(A, B)
  (%o4)                     {b, c}
  (%o4) {b, c}
  (%i5) intersect(A, B)
  (%i5) intersect(A, B)
  (%o5)                     {b, c}
  (%o5) {b, c}
  (%i6) setdifference(A, B)
  (%i6) setdifference(A, B)
  (%o6)                       {a}
  (%o6) {a}
  (%i7) symmdifference(A, B)
  (%i7) symmdifference(A, B)
  (%o7)                     {a, d}
  (%o7) {a, d}
  (%i8) subsetp(A, B)
  (%i8) subsetp(A, B)
  (%o8)                     false
  (%o8) false
  (%i9) subsetp(setdifference(B, A), B)
  (%i9) subsetp(setdifference(B, A), B)
  (%o9)                     true
  (%o9) true
  (%i10) powerset(A)
  (%i10) powerset(A)
  (%o10)         {{}, {a}, {a, b}, {a, b, c}, {a, c}, {b}, {b, c}, {c}}
  (%o10) {{}, {a}, {a, b}, {a, b, c}, {a, c}, {b}, {b, c}, {c}}
  (%i11) powerset(A, 2)
  (%i11) powerset(A, 2)
  (%o11)               {{a, b}, {a, c}, {b, c}}
  (%o11) {{a, b}, {a, c}, {b, c}}
  (%i12) cartesian_product(A, B)
  (%i12) cartesian_product(A, B)
  (%o12) {[a, b], [a, c], [a, d], [b, b], [b, c], [b, d], [c, b], [c, c], [c, d]}
  (%o12) {[a, b], [a, c], [a, d], [b, b], [b, c], [b, d], [c, b], [c, c], [c, d]}
  # 在 Maxima 中,用 % 表示上一条命令的输出,在这里,就是 A 与 B 的直积。
  # 在 Maxima 中,用 % 表示上一条命令的输出,在这里,就是 A 与 B 的直积。
  (%i13) cardinality(%)
  (%i13) cardinality(%)
  (%o13)                       9
  (%o13) 9
 
[[Category:Maxima]]

2015年5月2日 (六) 17:34的最新版本

来源:http://blog.chinaunix.net/u/20/showart_172159.html

作者:win_hate

Maxima: http://wiki.ubuntu.org.cn/Maxima

函数

定义函数

注意函数使用的符号是 :=

一元函数

f(x):=expr;

例子:

(%i1) f(x):= 1+x;
(%o1) f(x) := 1 + x
(%i2) f(2);
(%o2) 3

多元函数

f(x,y):=expr;

例子:

(%i3) f(x,y):=y^2+x^2;
 2 2
(%o3) f(x, y) := y + x
(%i4) f(2,3);
(%o4) 13

初等函数

幂函数: x^2, x^(-1/2),...;指数函数:2^x, (1/2)^x, exp(x), %e^x...
在 maxima 中,常数e=2.718281828459045被记为:%e. 所以指数函数 e^x 在 maxima 中被表示为:%e^x

由于这个函数的重要性,它有一个专门的记法:exp(x).

(%i2)f(x) := %e^x;
                                    x
(%o2) f(x) := %e
(%i3)g(x) := exp(x);
(%o3) g(x) := exp(x)
(%i4)expand(f(x) - g(x));
(%o4) 0
对数函数:log(x)
在 maxima 中,log(x) 就是自然对数,即以 e 为底的对数,数学上常记为 ln(x)。maxima 没有其它形式的对数,要使用以 10 或 2 为底的对数,只能使用换底公式。如果把下面的代码放到 ~/.maxima/maxima-init.mac 中,则 maxima 在运行时会加载自定义函数 log10、log2,并把 ln 定义为 log。这样就可以使用 log10、log2 和 ln 了。
log10(x):=log(x)/log(10);
log2(x):=log(x)/log(2);
ln:log; 
三角函数:sin, cos, tan, cot, sec, csc
在 maxima 中,pi=3.141592653589793 被记为 %pi.
反三角函数:asin, acos, atan, acot, asec, acsc

分段函数

f(x)= x-1, x<0
 0, x=0
 x+1, x>0
(%i2) f(x) := if x < 0 then x - 1 else (if x = 0 then 0 else 1 + x);
(%o2) f(x) := if x < 0 then x - 1 else (if x = 0 then 0 else 1 + x)
(%i3) f(- 1);
(%o3) - 2
(%i4) f(0)
(%o4) 0
(%i5) f(1)
(%o5) 2

极限

求极限的命令为:

limit (expr, var, val, direction);


expr 是要求极限的表达式; var 是变量名; val 指定在何处取极限;direction 是方向,可以是 plus 和 miuns,分别指右极限和左极限。


例子:

(%i2)limit (sin(x)/x, x, 0);
(%o2) 1
(%i3)limit (tan(x), x, %pi/2);
(%o3) und
(%i4)f:diff(abs(x), x);
(%i5)limit(f, x, 0, plus);
(%o5) 1
(%i6)limit(f, x, 0, minus);
(%o6) -1



其中 und 表示极限不存在。

如果要取无穷处的极限,可以用常数 inf, minf。前者表示正无穷,後者表示负无穷。

(%i1) limit (1/x, x, inf);
(%o1) 0
(%i2) limit (atan(x), x, inf);
(%o2) %pi/2
(%i3) limit (atan(x), x, minf);
(%o3) -%pi/2

导数

求导数:

diff(expr, var)

例子:

 (%i1) diff(sin(x),x);
 (%o1) cos(x)
 (%i2) diff(f(x)*g(x),x);
             d                  d
 (%o2) f(x) (-- (g(x))) + g(x) (-- (f(x)))
             dx                 dx

求高阶导数:

diff(expr, var, n)


例子:

 (%i3)diff(sin(x),x, 2);
 (%o3) - sin(x)
 (%i4) diff(f(x)*g(x),x,3);
              3                            2
             d                d           d 
 (%o4) f(x) (--- (g(x))) + 3 (-- (f(x))) (--- (g(x)))
               3              dx            2
             dx                           dx
                                     2                               3
                                    d            d                  d
                               + 3 (--- (f(x))) (-- (g(x))) + g(x) (--- (f(x)))
                                      2          dx                   3
                                    dx                              dx

集合

集合定义

maxima 似乎只支持有限集。建立集合的方式是列举。

set(a_1, ..., a_n)
n 个元素的集合
{a_1, ..., a_n}
同上
setify(foo)
list->set
把列表 foo 转换为集合
fullsetify(foo)
把列表 foo 转换为集合, 对列表的列表元素递归调用 fullsetify。列表的列表元素指的是:列表的一个元素,本身又是一个列表。

例子:

(%i2) A : set(1, 2, 3)
(%o2) {1, 2, 3}
(%i3) B : {a, b, c}
(%o3) {a, b, c}
(%i4) C : {}
(%o4) {}
(%i2) setify([a, b, c])
(%o2) {a, b, c}
(%i3) setify([a, b, [1, 2], [a, b, c]])
(%o3) {[1, 2], a, [a, b, c], b}
(%i2) fullsetify([a, b, [1, 2], [a, b, c]])
(%o2) {{1, 2}, a, {a, b, c}, b}


元素与集合

elementp(x,y)
判断 x 是否集合 S 的元素
adjoin(x, S)
返回集合 {t | (t in S) or t = x} 即返回把 x 添加到 S 中得到的集合,但 S 本身并不改变。
disjoin(x, S)
返回把 x 从集合 S 中去除後的集合,S 本身并不改变。

例子:

(%i2) A : {a, b, c}
(%o2) {a, b, c}
(%i3) elementp(a, A)
(%o3) true
(%i4) elementp(d, A)
(%o4) false

# 把 d 添加到 A 中
(%i5) adjoin(d, A)
(%o5) {a, b, c, d}

# A 并未改变,d 不是 A 的元素
(%i6) elementp(d, A)
(%o6) false

# 把 d 添加到 A 中,并把得到的集合赋值给 A
(%i7) A : adjoin(d, A)
(%o7) {a, b, c, d}

(%i8) elementp(d, A)
(%o8) true
(%i9) A : disjoin(a, A)
(%o9) {b, c, d}
(%i10) elementp(a, A)
(%o10) false

集合运算

emptyp(S)
判断 S 是否空集
intersection(A, B)
intersect(A, B)
同上,似乎无任何区别
union (A, B)
setdifference(A, B)
差,馀。 A\B
symmdifference(A,B)
对称差
subsetp(A,B)
判断 A 是否 B 的子集
subset(A, f)
返回集合 {x | (x in A) and (f(x)=true)} f 必须是谓词函数,也即其值域为 {true, false}。
subset (A, f)
返回一个 A 的一个子集合,由 A 中满足 f 的元素全体组成。
powerset(A)
返回 A 的全部子集合构成的集合。
powerset(A,n)
返回 A 的大小为 n 的子集构成的集合。
cartesian_product(A,B)
返回 A, B 的笛卡尔积(直积)。
cardinality
返回集合 A 的大小|A|。
disjointp(A,B)
若集合 A, B 相交,则返回 false,否则返回 true。

例子:

(%i2) A : {a, b, c}
(%o2) {a, b, c}
(%i3) B : {b, c, d}
(%o3) {b, c, d}
(%i4) intersection(A, B)
(%o4) {b, c}
(%i5) intersect(A, B)
(%o5) {b, c}
(%i6) setdifference(A, B)
(%o6) {a}
(%i7) symmdifference(A, B)
(%o7) {a, d}
(%i8) subsetp(A, B)
(%o8) false
(%i9) subsetp(setdifference(B, A), B)
(%o9) true
(%i10) powerset(A)
(%o10) {{}, {a}, {a, b}, {a, b, c}, {a, c}, {b}, {b, c}, {c}}
(%i11) powerset(A, 2)
(%o11) {{a, b}, {a, c}, {b, c}}
(%i12) cartesian_product(A, B)
(%o12) {[a, b], [a, c], [a, d], [b, b], [b, c], [b, d], [c, b], [c, c], [c, d]}
# 在 Maxima 中,用 % 表示上一条命令的输出,在这里,就是 A 与 B 的直积。
(%i13) cardinality(%)
(%o13) 9