打开mupad:

方法一:打开matlab(最新版本不支持),输入mupad

方法二:打开matlab(最新版本不支持),输入mupadwelcome,打开new notebook

语法

基本语法

运算符

按照优先级排序,不同优先级换行表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' 求导
[] 下标从1开始
@@ 函数迭代(?)
@ 函数复合(?)
! 阶乘; !! 双阶乘,如3!!=3,4!!=8,3!!!=(3!!)!=3!=6
^ 幂,如2^3+1=9 注意优先级,如2^(3^4)代表2^81,否则从左往右
*/
- 负号
+-
div 地板除;mod 取模 3 div 2 = 1 //注意空格
... 浮点数闭区间(?)
intersect 交集(?)
minus 差集(?)
union 并集(?)
.. 取值范围
= ~= <> < > <= >= in subset 第二个是约等于,subset是子集(?)
$ 创建序列
not
and
xor 逻辑异或(?)
or assuming 局部假设(?)
==> 逻辑蕴含(?)
<=> 逻辑等价(?)
| 函数在某点取值(?)
1
2
3
4
5
6
: 不显示结果的命令语句结束符
; 显示结果的命令语句结束符(默认)
:= 赋值
% 倒数第一个计算结果
%n 倒数第n个计算结果
// /* */ 代码注释,如z:=1/*123*/+2;
1
2
3
4
-> 映射而不计算
--> 映射并计算
{} 生成集合(也可以用下标)
\ 续行 系统设置输出区域每一行的最大字符个数的默认值为80,大于时续行

保留字:

1
2
3
4
D 值域
E e
I i
O 上界

基本数学函数

1
2
3
4
5
6
7
8
9
10
11
exp(x) 即E^x
ln(x) log10(x) log2(x) 自然对数函数
log(底, x) log(2,8)=3
sqrt(x) 开方 surd(x,n) 开n次方 会化简,而^运算符不会
max(可变参数) min(...) 最值
ceil floor round trunc 取整
sign abs 符号函数,绝对值函数
Re(x) Im(x) 取实数实部和虚部
arg(x) 复数辐角,范围(-PI,PI]
sin cos tan cot arc-... 三角和反三角
sinh cosh tanh coth 和arc-... 双曲和反双曲

取整函数

round

round(x)或round(x,n)四舍五入并保留n为小数

注意,对于分数,一定是准确的,但对于小数的0.5,有如下特性:

1
2
3
4
i+0.5$i=-4..6 
= -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5
round(i+0.5)$i=-4..6
= -4, -2, -2, 0, 0, 2, 2, 4, 4, 6, 6

基本命令

1
2
3
4
delete 清除标识符 删除一个或多个(逗号分隔) 不进行输出故;:等效
delete可以避免要用一个变量建立表达式,但它是程序意义上的变量而进行替代
domtype type 查看数据类型(略有区别,一般用前者)
float 计算近似值
1
hold() 不计算内部的内容,用于积分或只显示(数学格式)
1
2
assuming 逻辑条件  为当前计算设置前置条件
assume(条件) 为所有计算设置前置条件
1
2
numer(f) 返回分子
denom(f) 返回分母

控制命令

打印

可以不使用print,直接使用x;x为可打印变量;或赋值时开启;而不是使用:

在循环控制结构,应该使用print语句,使用后穿透end_for的:,且不会与原有的;型输出重复输出。

print():与print();效果相同;在一般顺次结构里,不会影响上一次的输出

if

格式有:

1
2
3
4
5
if 表达式 then
代码
else
代码
end_if;//;或:控制是否进行输出(多行只输出最后一次无论其本身:/;)

for

1
2
3
for i from v1 to v2 do
代码
end_for:

举例:

1
2
3
4
5
6
7
delete x,y;
x:=0:
y:=0:
for i from 1 to 10 do
x:=x+i;//记得分号(代码块的最后一行可以不)
y:=y+i*i;//只输出y的最后一次
end_for;//若改为:,一次也不输出

常量

1
2
3
PI,E 常量  I 虚数单位
infinity -infinity Left Right 常量
TRUE FALSE UNKNOWN 逻辑常量
1
2
3
N_ 自然数集
R_ 实数集
C_ 复数集

默认参数

普通
1
DIGITS 10 十进制有效小数位数,注意是有效小数位数,而不是小数位数

对于带有小数点的十进制数,如果为$a_m$非零数字,则称$0.00a_ma_{m+1} \dots a_{m+k-1}a_{m+k}$具有k位有效数字

超出有效小数部分会丢失,除非重改该常量,可提高计算精度。

如果DIGITS<=9,10^-10^的浮点数都是1.0e-10,精确值,科学计数法

如果>=10,都是0.0000000001,精确值

如果DIGITS<=15,2^-52^的浮点数都采用科学计数法,,尾数部分显示给定位数的有效数字,近似值

如果16<=DIGITS<=36,都采用小数,显示给定位数的有效数字,近似值

如>=37,采用小数,精确值(因为够位置显示了)

即规律为:如果已经有足够的位数显示所有,就精确,否则科学/近似

EPS为2^-52^ 约为2e-16

否则:1^20^+5=1^20^,1+1^-99^=1

输出与文本

输出方法

使用逗号间隔或作行末,最后使用分号,同一行内输出多个运算结果

使用冒号结尾,不输出运算结果

使用print输出,必然输出运算结果。

输出区域格式

在Notebook处较下方

Typeset Math

标准的印刷体数学符号(图片型/latex型)

Abbreviate Output

仅在Typeset Math下有效,显示缩写

Pretty Print

用纯文本模拟数学公式

将输出的任意内容复制到代码框,会得到一般纯文本(即输入的代码)

都不勾选就是一般的代码

下标输出

一个下划线对应右边1个字符,不能再多;没有下标嵌套

例如xyz_n3_m1为$xyz_n3_m1$

如果需要使用变量下标,应当用.号:

1
2
3
4
5
6
7
delete x_,n;
x_.1;
x_.n;
x_.1^2+x_.n^2;
x_.i $ i=1..3;//[1,3]闭区间
x_.{i} $ i=-10..15 step 5;
x_.i._.j $ j=1..3 $ i=1..3;//相当于内层j外层i

精确值

小数都是不精确的,分数可以符号运算

1
2
3
4
0.5+1/2 = 1.0
1/2+1/2 = 1
56^(1/2)=sqrt(56)(未化简)
56^0.5=7.483314774

特殊文本

还有更多在课件里找到复制到命令行就可以看到源码了

偏导数:

1
output::mathText(`&PartialD;`,u)/output::mathText(`&PartialD;`, x)

单位方向:

1
matrix([[`i&rarr;`, `j&rarr;`, `k&rarr;`]])

数据类型

常规

略(实数R、复数C、布尔值、表达式、函数等)

数组类

列表

DOM_LIST

帮助文档的Lists

1
2
a:=[[1,2],[3,4]]:
b:=[];//空列表

下标:以1开始,可以反着来,如-2代表倒数第二个

可以进行列表加法,乘法(一一对应组合),幂(同理)

列表可以同常数进行加法、乘法、幂操作

列表可以插入一个或多个元素,使用下面两种方法之一:

1
2
lt:=[a,b,c]:
lt2:=append(lt,d,e);//lt不变;如果是让lt真正插入,lt2改lt
1
2
lt:=[a,b,c]:
lt:=lt.[d,e];//连接运算符

删除某个元素,使用delete lt[下标]

可以用sort()函数升序排序

集合

DOM_SET

题目要求生成集合就加一个大括号

1
a:={x+y=1,x-y=3}:

自然有数学集合的特性,元素不能重复。列表转集合可以去重,方法:

1
unique_c = {c};//c是列表

默认升序排序

序列

1
2
3
4
5
a:=$1..9; //公差1首项1项数9等比数列
b:=k $ k=9..1 step -1//公差-1,余同上
c:=sin(k*PI/n) $ k=0..n;
x$5 五个重复的x
i^2$i in [1,3,-2] //集合也可

代数

表达式变换

代值

subs
1
2
3
delete a,b,c,x;
f:=a+b+c:
subs(f,[a=x^2,c=5]);

不会改变f

subs执行的类似于宏替代

subsex

同subs,但可以代入表达式,而不是死板类似宏替代

1
2
3
delete a,b,c,x;
f:=a+b+c:
subsex(f,a+c=x^2+5);

常态

normal(表达式)

分式会通分,用因式分解合并分母(但不拆,保留积的形式),分子也会因式分解;但normal分解因式不彻底

化简

传入的值可以是一个表达式,或多个表达式的列表/集合

simplify
  • 对三角函数的化简不是最简的
  • 对根式化简,提取公因式,可能不提取分母
Simplify
  • 三角函数化简到最简
  • 对根式化简,提取公因式;也会提取分母
radsimp

根式化简,不提取公因式

先expand后化简和直接化简对三角函数产生的结果可能不一致;expand后更可能元会变大,如从x到2x乃至4x

normal

通分

1
normal(11/33)

合并

collect

合并同类项,用法:collect(表达式,变元)

1
2
3
delete x,y,z;
p:=x*y^4+x*z+2*x^3+x^2*y*z+3*x^3*y^4*z^2+y*z^2+5*x*y*z;
collect(p,x);

分式会对分子分母都做

获得变元的N次多项式。如果变元有多个,使用列表,排序顺序按列表顺序,具体为:

  1. 有前者优先
  2. 都有前者,次数大优先

对[z,x]举例(忽略系数):$先后为:z^2x^3 \to z^2 \to zx^2 \to zx \to x^3 \to x$

用sincos合并sin(x)+cos(x)会得到cos的改写,
但S/simplify会写成sin

重写

rewrite

rewrite(f,g)用g重写f,例如:

1
2
3
4
5
6
delete x:
rewrite(tanh(x),exp);
rewrite(arcsinh(x),exp);
rewrite(exp(x),sinhcosh);//sinh,cosh
rewrite(exp(x),tanh);
rewrite(beta(x,y),fact);

分解

factor

命令factor计算多项式的因式分解,返回不可约因式的乘积

也可以进行数的幂归并或质因数分解。

factor(f)
factor(f, Full, MaxDegree=n)
factor(f, Adjoin=[k_1,k_2,…],MaxDegree=n)
factor(f,R_ )
factor(f,C_)

​ 如果多项式f的系数都是有理数,factor(f)就返回f在有理数域内的全部不可约因式的乘积的符号表达式;
​ 如果f的系数含有浮点小数,factor(f)就返回f在实数域内的全部不可约因式的乘积,但是所有系数以及f的全部实数根
​ 都输出成浮点数值(包括精确值和近似值);
factor(f, Full, MaxDegree=n)返回多项式 f 在复数域内的不可约因式分解(一次因式及其乘幂)的符号精确解,
​ 选项MaxDegree=n是符号解当中所用到的正整数次方根的最高次数(显然正整数 n 的最小值是2,因为不存在一次方根),系统的默认值是MaxDegree=2,即符号解只用到平方根。在代数学理论上已经知道五次及五次以上的一元代数方程没有一般的求根公式

1
2
3
4
5
6
delete x;
f:=(x^2+x+2)^2*(x^3+1)*(x^3-2*x-1);
factor(f);
factor(f, Full);//展开二次、三次等到复数集,如(x^2+x+x)^2展开在复数域的不可约因式分解的符号精确解;根式、复数都展开
factor(f, Adjoin=[sqrt(5)]);//实数域的不可约因式分解的符号精确解:展开根式而不展开复数
factor(f, R_);//展开根式并根式转float,不展开复数
1
2
factor(205891132094649/1073741824)
factor(992)
partfrac

partfrac(f,x)
partfrac(f,x,Adjoin=[k_1,k_2,…])
partfrac(f,x,Domain=R_)

1
2
3
partfrac(1/f);//展开为分式
partfrac(1/f, Adjoin=[sqrt(5)]);//+分解
partfrac(1/f, Domain=R_);//分解为float

有理函数展开

1
2
3
4
delete a,b,c,d,e,x;
P:=2-2*x;
Q:=x^5+x^4+2*x^3+2*x^2+x+1;
partfrac(P/Q);
1
2
3
4
5
6
//也可以用换元法
R:=a/(x+1)+(b*x+c)/(x^2+1)+(d*x+e)/(x^2+1)^2:
f:=collect(numer(normal(R)), x);
eqs:=coeff(f-P,[x]);//从最高次项至0提取系数(无则跳过)
S:=solve([eqs], [a,b,c,d,e]);
subs(R, S[1]); //与上面结果一致

计算有理函数积分:

1
2
3
4
delete x;
//int(x^7/(x^3+1), x);
partfrac(x^7/(x^3+1));
int(x^4-x, x) - int(1/(3*(x+1)), x) +int((x/3+1/3)/(x^2-x+1), x);
其他

numer(f) 返回分子
denom(f) 返回分母
normal(f)把相除之后的真数通分
coeff(f)提取单变量多项式的系数(按系数降序,若无系数跳过该项)
coeff(f,[x])以x为变元提取系数

1
2
subs(-(t*(t^4+3)^(1/2))/3, t=((x+1)/(x-1))^(1/2));
normal(%) assuming x>1;

求和

sum(表达式, 求和范围) 返回符号解

numeric::sum(同上) 则返回数值解(默认十位小数)

1
2
3
sum(i,i=1..10);
delete i,n;
sum(i^3,i=1..n);
1
2
3
4
5
delete j,k,n,t;
v:=t->160-9.8*t:
sum(v((k-1)*(3/n))*(3/n), k=1..n);
Simplify(%);
limit(%, n=infinity);

product求积

1
product(i,i=3..5)

方程

方程的写法

一般
  • 一个表达式,如x^2^+1
  • (推荐)映射g:=x->x+1, g:=(x,y)->x^2^+y^3^,如果需要计算导数等,—>
  • 分段函数piecewise
  • 复合函数f(g(x))可以写作f@g
分段函数

piecewise

1
2
3
delete f,x,pw;
f:=x->piecewise([x<0 or x >1,0],[x>=0 and x<=1,1])
pw:=x->piecewise([x>0 and x < 1,1],[Otherwise,0]);

举例:

1
2
3
4
5
6
7
8
h:=t-->int(v(s), s=0..t);//可以计算用-->
h'(t);

f:=x-->x^2:
g:=x-->sin(x):
(g@f)(2)

f:=(x,y)-->x*x*y/(x*x+y*y):

在绘图时,可以用Otherwise和undefined来让一些不想要绘图的地方不画:

1
2
3
4
5
6
7
8
9
10
delete x,y,z:
h1:=(x,y)->piecewise([x^3<=y<=sqrt(x), 0], [Otherwise, undefined]):
h2:=(x,y)->piecewise([x^3<=y<=sqrt(x), 1+x^2+y^2], [Otherwise, undefined]):
f:=(y,z)->piecewise([z<=1+y^4+y^2, z], [Otherwise, undefined]):
g:=(x,z)->piecewise([z<=1+x^2+x^6, z], [Otherwise, undefined]):
S1:=plot::Function3d(h1(x,y), x=0..1, y=0..1):
S2:=plot::Function3d(h2(x,y), x=0..1, y=0..1):
S3:=plot::Surface([y^2, y, f(y,z)], y=0..1, z=0..3, Color=RGB::Green):
S4:=plot::Surface([x, x^3, g(x,z)], x=0..1, z=0..3, Color=RGB::Blue):
plot(S1, S2, S3, S4);

解方程

solve

1
2
solve(方程,自变量,MaxDegree=最高次)
可以加上Real表示在实数范围内求解
1
2
3
delete x:
solve(x^3 + x^2 + 1 = 0, x, MaxDegree = 3);//=0可以省略
solve(a*x^2+b*x+c,x);
1
2
delete x,y;
solve({x+y=1,x-y=3},{x,y});//方括号也行

参数不够也能解,未知参数会保留:

1
solve([x-y+2*z=6, 2*x+y+z=5], [x,y,z]);
1
2
3
solve(x^2=-1);
solve(x^2=-1,Real);//无解,输出空集
solve((1/(n+1)^2-0)<epsilon,n,Real)assuming n > 0;

使用assuming限定范围:

1
2
delete x,a,b,c:
solve(a*x^2+b*x+c,x) assuming a<>0;

待解决:纯虚数等值域问题

MaxDegree开得小将不能求解三次方根,三次方根必须开MaxDegree求解:

1
2
delete a,b,c;
solve(a*x^3+b*x^2+c*x+d=0,x,MaxDegree=3)

但是即便开了MaxDegree,最高只能求4次方程的通解或特解。

如果只需要某个方程的数值解而不是符号解,应当使用numeric::solve,当然这个是可以算五次方或以上的,而且不用开MaxDegree。

1
numeric::solve(13*x^4+2*x^3+5*x^2-7*x+16=0,x);

低次时,float(solve(..))即可得到某个特解的数值解。

语法格式为:

(1) numeric::solve(eqs, vars, options)

说明:

eqs:只求解一个方程时,eqs指代方程的表达式;求解方程组时,eqs指代若干个方程表达式的集合

(DOM_SET类型,用一对花括号括住若干个方程表达式)或者列表(DOM_LIST类型,用一对方括号括住若干个方程表达式);

vars:只有一个未知数时,vars指代未知数的标识符;有多个未知数时,vars指代若干个未知数的标识符的集合

(DOM_SET类型,用一对花括号括住若干个方程表达式)或者列表(DOM_LIST类型,用一对方括号括住若干个方程表达式);一般而言,未知数的个数等于方程的个数;eqs与vars的类型须一致;

options:可选项,本次实验需要用到AllRealRoots,用于求出方程(一个未知数)的全部实根的数值解.

(2) numeric::solve(eq, var=a) 返回方程(一个未知数)在数值a附近的一个数值解.

(3) numeric::solve(eq, var=a..b) 返回方程(一个未知数)在区间[a, b]范围内的一个数值解.

(4) numeric::solve(eq, var=a..b, AllRealRoots) 返回方程(一个未知数)在[a, b]范围内的全部实根的数值解.

可以给一个初始值,找这附近的解

1
numeric::solve(subs(E^y+x*y-E, x=-2), y=2);

也可以给区间范围

1
numeric::solve(subs(E^y+x*y-E, x=-2), y=-2..3, AllRealRoots);

其他

linsolve:求解线性方程组
RootOf:求解多项式的根
solve:求解方程组和不等式组(具见上)
testeq:检验两个表达式是否相等
divide(p,q,[x])多项式除法,返回商和余

1
2
testeq(0.5,1/2)//TRUE,不能测三个参数
divide(x^5,x+1,[x])

高等数学

极限

limit(表达式,自变量趋向值,<趋向方向>)

使用infinity,-infinity表示无穷;

使用Left,Right表示左极限和右极限,默认双侧极限

1
2
3
4
limit(a*(1 - cos(x))/x^2, x=1);
limit(a*(1 - cos(x))/x^2, x);//即x=0
limit((1 + 1/n)^n, n = infinity);
limit(1/x, x = 0, Left);

返回值若为undefined,表示极限不存在

重极限

如果存在,则先算一层再算一层

1
2
f:=(x,y)--> ((x*y + 1)^(1/2) - 1)/(x*y)
limit(limit(f(x,y),x=0),y=0)

求导

显函数

使用映射,如:

1
2
delete x;
f:=x->exp(x)+x^2;

可以直接求导:

1
2
f';
D(f);//二者等效

可以带入值运算:

1
2
D(f)(x);  D(f)(1);
f'(x); f'(1);

可以使用函数diff//还是觉得很迷,这样的出来的无法计算数值

diff(f, x $ n)返回 n 阶导数

1
2
3
delete f,x:
f:=x->x^3;
diff(f(x),x)
1
2
3
4
delete n,x;
diff(sin(n*x)*sin(x)^n, x);
diff(sin(n*x)*sin(x)^n, x $ 2);
diff(sin(x), x $ n) $ n=1..8;
1
2
f:=(E^x)*cos(x):
diff(f,x$36);

抽象函数:

1
2
3
4
5
6
delete x,y:
eq:=diff(E^y(x)+x*y(x)-E, x);//不能写成y
S:=solve(eq, diff(y(x), x));//求dy/dx
d1y_x:=-y(x)/(x+exp(y(x)))://S的结果
d2y_x:=diff(d1y_x, x);
d2y_x:=normal(subsex(d2y_x, diff(y(x), x)=d1y_x));

隐函数求导可以使用公式:

1
2
3
4
F:=E^y+x*y-E:
d1y_x:=-diff(F,x)/diff(F,y);
diff(d1y_x, x)+diff(d1y_x, y)*d1y_x;
d2y_x:=normal(%);

也可以使用微分法。

1
2
3
4
5
delete x,y,dx,dy:
F:=E^y+x*y-E;
dF:=diff(F,x)*dx+diff(F,y)*dy;
solve(dF,dy);
//然后把dx拉过去即可,然后用上面的公式求二阶导
隐函数
1
2
3
4
5
6
7
delete x,y:
diff(E^y(x)+x*y(x)-E=0,x);
solve(%,y'(x))

//上面的二阶导:
diff(-y(x)/(x + exp(y(x))),x);
normal(subsex(%,diff(y(x),x)=-y(x)/(x + exp(y(x)))))
参数方程
1
2
3
4
5
delete x,y,t,a:
x:=a*(t-sin(t));
y:=a*(1-cos(t));
d1:=diff(y,t)/diff(x,t);
d2:=simplify(diff(d1,t)/diff(x,t))
偏导数

diff(f, x1, x2, …) 对自变元x1, x2, …依次求高阶偏导数,例如diff(f, y, x)即先x再y(?)

命令gradient用来计算多元函数的梯度(列向量),语法格式:

gradient(f, x),梯度是对每个元的偏导数的向量,$\nabla$

1
2
f:=(x,y)-->(sqrt(1-x*x-y*y)):
grf:=gradient(f(x,y),[x,y]);//列向量

例如:

1
2
3
4
5
6
delete x,y:
f:=(x,y)->-x^2/4-y^2/6;
D([1],f);
D([1],f)(-1,1);
D([2],f);
D([2],f)(-1,1);

或:

1
2
3
4
5
g:=-x^2/4-y^2/6;
diff(g, x);
subs(diff(g,x), x=-1, y=1);
diff(g, y);
subs(diff(g,y), x=-1, y=1);

求梯度:

1
2
f:=(x,y)->-x^2/4-y^2/6;
Gr:=gradient(f(x,y), [x, y]);//返回列向量

例如:

1
2
z:=ln(sqrt(x*x+y*y)):
simplify(diff(z,x,x)+diff(z,y,y));

注意不等价:

1
2
3
4
u:=f((s-sqrt(3)*t)/2,(sqrt(3)*s+t)/2);
u:=f(x,y):
x:=(s-sqrt(3)*t)/2:
y:=sqrt(3)*s+t)/2:

但是顺序换回来就等价了,即u赋值放在最后

两种写法等价:

1
2
3
4
5
6
7
8
9
delete x,y,z,f:
w:=f(x+y+z, x*y*z):
diff(w,x);
diff(w,x,z);

delete x,y,z,f:
w:=(x,y,z)->f(x+y+z, x*y*z);
D([1],w);
D([1,3],w);
雅克比

使用jacobian计算函数组f1,f2…fm关于x1,x2…xn的雅可比矩阵:

1
jacobian([f1,...,fm],[x1,...,xm])

再对结果使用det命令返回雅克比行列式。

以用全微分法和解线性方程组求隐函数组的偏导数,其求解公式为:

1
2
-inverse(jacobian([F,G],[x,y]))*jacobian([F,G],[z]);
subs(%,[x=-1, y=-1, z=sqrt(2)]);

积分

不定积分

命令int(f, x)返回被积函数的一个原函数.

这个f建议现输,用一个变量可能会出点问题

与一般手算积分的区别:

  • 省略任意常数
  • 对数的真数部分都不带绝对值号

不能计算出原函数时,命令int返回待求的积分表达式

1
2
3
4
5
delete a,x;
int(1/(a-x), x);
int(1/sqrt(a^2-x^2), x);
int(1/sqrt(a^2-x^2), x) assuming a>0;//结果不一样
int(x*(x+1)^n, x) assuming n in N_;

注意:

  • 直接计算有理函数可能出现虚数解,应当先拆后算,见语法-代数-表达是变幻-分解-partfrac
换元积分法

intlib::changevar(integral, eq, var)

命令intlib::changevar(integral, eq, var)会自动检查换元的方程eq能否解出新积分变量(对于第二换元法,就是是否能解出反函数,这在理论上是必须满足的条件),如果不能唯一地解出来(反函数不存在)或者解不出来(非初等函数),系统会分别给出警告信息(命令返回换元后的结果,该结果是否合理需要小心验证)或者错误信息(命令不返回计算结果).

如果不使用hold,那么直接返回最终结果,跟一般计算没什么区别,如果要看中间过程,需要hold:

1
2
3
4
//第一类换元法
intlib::changevar(hold(int(x/sqrt(1-x^2),x)), v=1-x^2, v);
int(-1/(2*v^(1/2)), v);//再计算
subs(%, v=1-x^2);
1
2
3
4
5
6
7
//第二类换元法
delete t,v,x;
intlib::changevar(hold(int(x/sqrt(1-x^2),x)), x=sqrt(1-v), v);
intlib::changevar(hold(int(x/sqrt(1-x^2),x)), x=-sqrt(1-v), v);//两种情况分别讨论

intlib::changevar(hold(int(x/sqrt(1-x^2),x)), x=sin(t), t); //或更好的换元法
Simplify((2^(1/2)*sin(2*t))/(2*(cos(2*t)+1)^(1/2))) assuming cos(t)>0;
分部积分法

intlib::byparts(integral, du)

du是换到d里面的整体表达式(换前,即在原式看得到的部分)

1
2
3
4
5
//解法一
intlib::byparts(hold(int(exp(a*x)*cos(b*x), x)),exp(a*x));
intlib::byparts(hold(int(exp(a*x)*sin(b*x), x)),exp(a*x));
solve({P=exp(a*x)*cos(b*x)/a+b/a*Q,
Q=exp(a*x)*sin(b*x)/a-b/a*P}, {P,Q});
1
2
3
4
5
6
//解法二
intlib::byparts(hold(int(exp(a*x)*cos(b*x), x)), exp(a*x));
exp(a*x)*cos(b*x)/a + b/a*intlib::byparts(hold(int(exp(a*x)*
sin(b*x), x)), exp(a*x));
collect(%,exp(a*x)); //合并含有exp(a*x)的两个函数表达式
solve(P=(cos(b*x)/a+(b*sin(b*x))/a^2)*exp(a*x)-(b/a)^2*P, P);
定积分

int(f,x=a..b)计算定积分

反常积分
1
int(1/(x^2+x-2),x=2..infinity)
重积分

可以用展开为一重积分的式子来计算:

1
2
int(int(cos(y*y),y=x..1),x=0..1)
int(int(exp(y/x),y=x*x..x),x=1/2..1)

极值

黑塞矩阵

命令hessian用来计算多元函数的黑塞矩阵,语法格式:

1
hessian(f, x)

二元函数的黑塞矩阵$H_f(P_0)$是实对称矩阵,且其行列式为$AC-B^2$:

代入点,若矩阵正定,则在点处严格极小值;若负定,严格极大值,否则不能取极值,是鞍点;若行列式为0,无法判断。

泰勒展开

1
taylor(cos(x),x,5)

线性代数

矩阵

创建
一般矩阵

命令matrix(m, n)创建m行n列的零矩阵.

该矩阵可以跟二维数组一样使用。

matrix(m,n,对应二维数组)创建矩阵:

1
matrix(2,3,[[1,2,3],[4,5,6]])

可以不写行列:

1
matrix([[1,2,3],[4,5,6]])

可以使用一个长度小于m的一维数组补足第一列,其余部分用0代替。

1
matrix(3,5,[1,2,3])

使用二维数组则按照常规理解灵活补足:

1
matrix(3,5,[[1],[2,3],[4,5,6]])

创建行向量和列向量matrix([[]]), matrix([]),如:

1
2
matrix([[1,2,3]]) //行
matrix([1,2,3]) //列
雅克比矩阵
1
jacobian([f1,f2,...,fn],[x1,x2,...,xn])
行列式

det(A)
det(A, Normal=FALSE)
说明:
A:方阵,矩阵类型;
Normal:可选项,默认值为Normal=TRUE,即计算行列式时系统自动使用命令normal进行通分运算再返回计算结果,
这样有可能需要较长的耗用时间,设置Normal=FALSE,可以得到未通分的结果,并且缩短耗用时间.

1
2
y:=matrix(3,3,[[1,3,3],[4,5,6],[7,8,9]])
det(y)
1
2
det(matrix([[1,x*(x+1),x],[x^2,1,x^2],[1,2*x,x*(x-1)]]),Normal=FALSE) //这个未化简,下面化简了:
det(matrix([[1,x*(x+1),x],[x^2,1,x^2],[1,2*x,x*(x-1)]]))
运算
加法

+即可

乘法

*即可,注意左右顺序,如:

1
matrix([[1,2,3]])*matrix([3,4,5]) #得到1阶矩阵
1
matrix([[1,2,3],[4,5,6]])*matrix([[3,4],[5,6],[7,8]])

标量乘法同理。

链接

使用.符号链接两个向量,如果规格不同自动补0

1
matrix([1,2]).matrix([[3,4,5]])
拓展

如果左边是列向量,右边是行向量,*号拓展生成矩阵,

1
matrix([1,2,3])*matrix([[3,4,5]])
1
2
x:=matrix(3,3,[[1,2,3],[8,9,4],[7,6,5]]);
linalg::rank(x)

向量

用行矩阵或列矩阵创建向量。

模长

norm(v,2)

注意如果norm(v,n),$n\in\Z$,表示式子:

1
2
x:=matrix([1,2]) //如果数组不行
norm(x,2)
单位向量

将向量化为方向向量,即每个元除以它的模长。返回向量。

1
linalg::normalize(x)
方向角

先化单位向量,然后迭代arccos:

1
2
x:=matrix([[-1,1,-sqrt(2)]]):
arccos(linalg::normalize(x)[i]) $i=1..3
运算
数量积

linalg::scalarProduct(a, b)
linalg::scalarProduct(a, b, Real)
说明:
a, b:元素个数相等的向量(行或列皆可),矩阵类型;
Real:可选项,注意首字母R需要大写,默认格式linalg::scalarProduct(a, b)按照复向量的数量积的数学定义返回

只能算列向量。若下面是matrix([[1,2]])和matrix([[3,4]])无效

1
2
3
x:=matrix([1,2])
y:=matrix([3,4])
linalg::scalarProduct(x,y)
向量积

只有在 3 维向量之间才有向量积运算

linalg::crossProduct(x,y)

1
2
3
x:=matrix([1,2,3])
y:=matrix([4,5,6])
linalg::crossProduct(x,y)
夹角

linalg::angle(x,y) //或y,x,结果相同。

对于二维向量与x轴正向夹角,可以用arg:

命令arg计算复数及其相应的平面向量 (x, y) 的辐角,即向量与 x 轴正向所成的角,以逆时针为正向,

规定辐角的范围是. 语法格式为:

arg(x+iy)

arg(x, y)

1
2
3
4
5
6
f:=(x,y)-->(x*x-y*y)/2:
x0:=1:
y0:=-1:
fx:=D([1],f)(x0,y0):
fy:=D([2],f)(x0,y0):
t0:=arg(fx,fy); //pi/4

绘图

plot

plot(元件(可变参数),默认参数)绘制图像

注:三维图像可以鼠标拖拽更换视角

绘图参数

GridVisible = TRUE 显示网格 #G

Scaling = Constrained 或 #C 坐标轴等比

Mesh = 121 采样点数

AdaptiveMesh = 4 自适应采样(0关闭)

Mesh=[m, n],即XMesh=m,YMesh=n.

将变量 x 和 y 的取值范围分别进行等分和等分,获得平面 Oxy 上的矩形网格,(参数方程则对应方程)

生成空间中相应的 x 线和 y 线,进而生成网格状曲面. 默认值Mesh=[25, 25].

Submesh=[s, t],即XSubmesh=s,YSubmesh=t.

如果XMesh或YMesh的值不够大,二元函数图像的网格状曲面的分辨度就不够高,看起来就不够光滑和细致.

Submesh可以得到平面 Oxy 上的加密的矩形网格,从而生成分辨度更高的网格状曲面,看起来更光滑更细致.

默认值Submesh=[0, 0],即没有额外的加密.

当XMesh=m,XSubmesh=s的时候,x 的取值范围先等分成个小区间,对每一个小区间,

再进一步额外等分成个小区间,从而在 x 的取值范围,总共取得了个均匀等距的采样点.

y 的取值范围也以同样的方式获得额外加密的采样点,从而与 x 的采样点一起构成额外加密的网格.

AdaptiveMesh=n.

采用自适应采样技术来绘制函数图像,非负整数 n 是自适应采样的深度,默认值为 0,即不启用自适应采样;

当 n 是正整数时,启用自适应采样,值越大采样点越细密,图像逼真度越高,但是耗时也越长.

建议从默认值开始,以 1 为步长逐步增加深度 n,直到获得满意的图像为止.

注1:根据对Mesh的解释,XMesh和YMesh都至少是2,否则不能产生曲面的图像;
注2:因为系统默认由Mesh决定的 x 线和 y 线显示在曲面上,并且它们的数量在视觉上恰好合适,
所以不建议修改Mesh的值;
注3:由Submesh产生的更细密的网格线不显示在曲面上

XLinesVisible=TRUE / FALSE

YLinesVisible=TRUE / FALSE

以X为例。默认值为TRUE,在曲面上显示由Mesh确定的 x 线;若设置为FALSE,曲面上不显示 x 线.

对Surface,将X,Y改为U,V

#x = 1 绘制水平虚线(黑色)

#y = -1 绘制垂直虚线(黑色)

ViewingBox = [x1..x2,y1..y2] 可视范围

AxesVisible=FALSE 不显示坐标轴(默认显示)

Axes=Origin 或 #O 坐标原点显示在图形里

AxesTitles=[列表] 坐标轴名称

YAxisTitle = “y” y轴名称 //da tr X同理

ViewingBox=[x1..x2,y1..y2] 可视区域(会覆盖#O)//三维还有z

Height=80 高度(mm)

Width=120 宽度(mm)

Header=”123” 顶部文字

Footer=”123” 底部文字

注:当图像分辨率不够高时,可以在命令plot::Function3d、plot::Implicit3d和plot::Surface设置选项AdaptiveMesh=3(自适应采样的深度为3,深度取3通常就足够了,该正整数值越大耗用时间越长),或者在命令plot::Function3d和plot::Surface设置选项Submesh=[4,4](每个采样点区间内额外增加4个采样点,在命令plot::Implicit3d改成设置Submesh=[4,4,4],加密4个采样点通常就足够了,该正整数值越大耗用时间越长),都能较好地提高图像的分辨率,改善图像的逼真程度.

使用VisibleBefore和VisibleAfter、TimeRange控制分步动画。

分步动画示例:

1
2
3
4
5
6
7
8
9
10
11
Py:=plot::Group3d(plot::Point3d(
[x,y,f(x,y)], x=1/2..0, PointSize=2,
VisibleBefore=10, TimeRange=0..10)
$ y=-0.95..0.95 step 0.1):
//取定y,令x趋于0所得到的动点族,动画在第010秒演示,在第10秒之前可见
Px:=plot::Group3d(plot::Point3d
([0,u,f(0,u)], u=y..0, PointSize=2,
VisibleAfter=10, TimeRange=10..15)
$ y=-0.95..0.95 step 0.1):
//取定x=0,令y趋于0所得到的动点族,动画在第10秒后可见,在第1015秒演示
plot(Gf, Cy, Py, Px, Ly, #C);

元件参数

非泛用的见各元件

颜色
RGB

默认RGB::Blue

  • Color=RGB::Red
    常见的(但不常写)颜色:Grey,Grey50
  • Color=[r,g,b] //取值为[0,1],其中[0,0,0]为黑,[1,1,1]为白

查看颜色的RGB名字://如无返回近似的

1
RGB::colorName([0,0,0])

查看某颜色str的颜色效果

1
RGB::plotColorPalette("PrussianBlue")
RGBa

三元列表增设第四个参数a,取值范围为$[0,1]$,从完全透明到完全不透明

可以用链接运算符与一般的颜色单词连用,如:

1
RGB::Black.[0.25]
动画参数

基本方法:添加一个变量标识符,然后在参数区域的变量范围之后给这个标识符确定一个范围,如下所示:

1
2
3
delete a;//a是动画参数
f1 := plot::Function2d(sin(a*x), x = 0..2*PI,a=1..3):
plot(f1,#C)
1
2
f2 := plot::Function2d(sin(a*x),a=1..3,x = 0..2*PI);
plot(f2,#C,#O)//x是动画参数

Frames = 40 帧数

TimeRange = 0..10时长

1
plot(plot::Function2d(sin(b*x), x = 0..2*PI, b = 1..2, Frames = 100,TimeRange=0..1)):

若值域含动画参数,可以模拟绘制过程:

1
2
3
C2 := plot::Curve2d([sin(t), cos(t)], t = 0..b, b=0..2*PI);
P := plot::Point2d([sin(t), cos(t)], t=0..2*PI);
plot(C2,P,#C)

动画参数可以从大到小,从小到大或其他特殊变化。

使用AdaptiveMesh=3改善绘画效果,避免曲线折线化:

1
2
curve := plot::Curve3d([sin(t)*cos(20*t), sin(t)*sin(20*t), cos(t)],t = 0..b, b = 0..PI,AdaptiveMesh=3):
plot(curve,#C)

当然也可以加上Mesh(或XMesh,YMesh,其乘积为Mesh)

1
plot(plot::Curve2d([x,sin(1/x)],x=1/b..1,b=PI/2..20*PI+PI/2,Mesh=1000,AdaptiveMesh=3,Frames=21),   plot::Point2d([1/b,sin(b)],b=PI/2..20*PI+PI/2,Frames=21),ViewingBox=[0..1,-1..1]);

Submesh 额外采样点密度,默认0,这三者主要用于奇点

线形

LineStyle

  • Solid 实线(默认)
  • Dashed 虚线
  • Dotted 点划线
线宽

LineWidth,单位mm,要用其他单位,使用诸如unit::cm(默认0.35)

点型

默认值是PointStyle=FilledCircles

  • Squares//空心正方形
  • FilledSquares//实心正方形
  • Circles//空心圆
  • FilledCircles//实心圆
  • Crosses//+十字
  • XCrosses//x十字
  • Diamonds//空心斜正方形
  • FilledDiamonds//实心斜正方形
  • Stars//密*形星
点宽

PointSize 默认值是PointSize=1.5,单位是毫米.

元件

Function2d

函数

plot::Function2d(f,x=xmin..xmax,)

1
2
delete x;
f1 := plot::Function2d(sin(x), x = 0..2*PI);

如果在某处具有奇异性,则会有铅锤的虚线,如$\sqrt{1-x^2}$的$x=\pm1$处

对比不同元件画一个圆的质量:

  • Function2d 在接近$x=\pm1$时不佳(因为奇异性)
  • Implicit2d比前者好,但仍有瑕疵
  • Curve2d/Polar质量较好;Polar不加#C也能等比例显示
Function3d

plot::(二元函数,x范围,y范围) //如果不提供范围,默认为$[-5,5]$

有参数XLinesVisible,YLinesVisible,ZContours(无X,Y的)

1
plot::Function3d(-x-y,x=-2..2,y=-2..2)

用命令plot::Surface按照参数方程绘制圆锥面比用命令plot::Function3d的效果更好

Curve2d

参数方程

plot::Curve2d([x的参数方程,y的参数方程],参数取值范围)

1
curve := plot::Curve2d([r*sin(r), r*cos(r)], r = -6..6);
1
2
curve := plot::Curve3d([sin(thet)*cos(20*thet),
sin(thet)*sin(20*thet),cos(thet)],thet = 0.2*a..a, a = PI..0):
Curve3d

同理,加多一个参数方程。

Implicit2d

隐函数

plot::Implicit2d(方程,x取值范围, y取值范围)

1
2
plot(plot::Implicit2d((x-y)*(x+y), x = -1..1, y = -1..1))
plot(plot::Implicit2d(x^2 - y^2 = (x - a*y)*(x^2 + y^2),x = -2..2, y = -2..2, a = -2..2)

可以绘制二元函数的等高线/等值线:

plot::Implicit2d(f(x, y), x=xmin..xmax, y=ymin..ymax, Contours=c)

plot::Implicit2d(f(x, y), x=xmin..xmax, y=ymin..ymax, Contours=[c1, c2, …, cn])

有参数Contours,即绘制等高线在xOy的投影

1
2
3
4
z0:=0.4:
Ct:=plot::Implicit2d(sin(x-y),
x=-PI..PI, y=-PI..PI, Contours=z0):
plot(Ct, #C);

命令plot::Implicit2d可通过设置图形属性Contours绘制二元函数的等高线,并设置图像属性

LineColorFunction实现按照高度来着色,从低到高由蓝色渐变到红色. 语法格式:

plot::Implicit2d(f(x, y), x=xmin..xmax, y=ymin..ymax, Contours=[c1, c2, …, cn],
LineColorFunction=((x,y)->[(f(x,y)-m)/(M-m),0,(M-f(x,y))/(M-m)]))

说明:

m和M分别是在取值范围内的最小值和最大值;

这条命令绘制 n 条等高线, f(x,y)=c_1, …,f(x,y)= c_n… ,,按照高度c1, c2, …, cn从低到高的顺序(即数值从小到大),

等高线的颜色由蓝色渐变到红色.

1
2
Gzc:=plot::Implicit2d(f(x,y), x=-5..5, y=-5..5, Contours=[$0..1 step 0.1],LineColorFunction=((x,y)->[f(x,y), 0, 1-f(x,y)])):
plot(Gzc, #C);
Implicit3d

隐函数,由于耗用时间较其他方法长,分辨率也较其他方法低,不推荐使用

Inequaity

绘制不等式确定的平面(注意不是空间)点集

plot::Inequality(ineq, x=xmin..xmax, y=ymin..ymax, Attributes)
plot::Inequality([ineq1, ineq2, ……], x=xmin..xmax, y=ymin..ymax, Attributes)

例如:

1
2
Ig:=plot::Inequality([x^2+(y-1)^2>1, x^2+(y-2)^2<=4], x=-3..3, y=-1..5): //平面点集(在图中范围内是绿色的,否则是红色的)
plot(Ig, #C);

(1) FillColorTrue,满足不等式(组)的平面点集的颜色,默认值RGB::Green;
(2) FillColorFalse,不满足不等式(组)的平面点集的颜色,默认值RGB::Red;
(3) FillColorUnknown,系统不能判断部分的颜色,默认值RGB::Black.

由于命令plot::Inequality对不等号>和≥、<和≤不加区分,所以边界常常是系统不能判断的部分,
而且不论开集、闭集,边界默认都绘成实线,而且上述图形属性的默认值常常不符合需要,可以作出如下调整:
(1) 把图形属性FillColorFalse和FillColorUnknown都设置为RGB::White(白色),
把FillColorTrue设置成我们想用的颜色;
(2) 另外用plot::Function2d、plot::Curve2d、plot::Implicit2d或者plot::Line2d等命令绘制边界,
用虚线(设置LineStyle=Dashed)表示开集的边界,用实线(系统默认值)表示闭集的边界;
(3) 如果点(a, b)不属于定义域,则用命令plot::Circle2d(r, [a,b])画一个半径为r的圆圈(r取相对比较小的数值),
表示去掉该点.

例如:

1
2
3
4
Ig:=plot::Inequality([x^2+(y-1)^2>1,x^2+(y-2)^2<=4], x=-3..3, y=-1..5,FillColorFalse=RGB::White,FillColorUnknown=RGB::White):
Cg1:=plot::Curve2d([2*cos(t),2+2*sin(t)], t=0..2*PI):
Cg2:=plot::Curve2d([cos(t),1+sin(t)],t=0..2*PI, LineStyle=Dashed):
plot(Ig, Cg1, Cg2, #C);
Plane

生成平面

可以用:

①平面点法式方程,第一个参数是点(三元数组即DOM_LIST),第二个参数是法向量(三元数组)

②平面三点式方程,前三个三个参数分别是三个点

两种格式都不需要设置直角坐标范围,系统会根据在同一幅图里面其他的图形对象的直角坐标范围自动匹配

Polar

极坐标

方程为[r方程,$\theta$方程]

1
2
plot(plot::Polar([r, PI/3], r = 0.8..1))//直线
plot(plot::Polar([arccos(sin(r)),r], r = 0..2*PI))

可以额外使用Mesh默认参数,如Mesh=400,提高平滑感。

这个也可以用AdaptiveMesh=4

Point2d

1)plot::Point2d(x, y, , )
2)plot::Point2d([x, y], , )

PointStyle:点的形状,默认值是PointStyle=FilledCircles,还有8种形状可用:Squares, FilledSquares, Circles, Crosses, XCrosses, Diamonds, FilledDiamonds, Stars;

PointSize:点的尺寸,默认值是PointSize=1.5,单位是毫米.

1
plot::Point2d(2, 2, PointSize = 50, PointColor = RGB::Grey50, PointStyle = Circles)
Point3d

同理

PointList2d

plot::PointList2d(pts, , )
pts:点列坐标的列表,形如[[x1,y1],[x2,y2],… ,[xn,yn]]或者[[x[i],y[i]]$i=1..n],列表类型,要有两重方括号;

1
2
3
PL1 := plot::PointList2d([[1,1],[2,4],[3,9],
[4,16],[5,25]],PointStyle=Stars);
PL2 :=plot::PointList2d([[i,i^2]$i=1..5],PointStyle=Stars);
Sequence

参数(关于n的通项表达式,n范围)

Line2d

plot::Line2d([x1, y1], [x2, y2], , )
LineStyle、LineWidth和 LineColor来修饰直线段

1
2
L2:=plot::Line2d([-3,-3],[3,3],LineStyle = Dashed,
LineWidth = 2.5*unit::mm, LineColor = RGB::Green):
Line3d

同理,给定两点,生成直线段。

Arrow2d

有向线段,首个坐标为箭尾,第二个为箭头

可以直接扔向量(dack)

1
plot(plot::Arrow2d([0,0],[1,1]));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
delete t;
T:=b/a*2*PI:
a:=1: b:=0.8: //修改b的值(0<b<=a),观察图像的变化
Cc:=plot::Curve2d(P_t(t), t=0..T, Color=RGB::Red): // 外摆线,t是曲线参数
// 以下图形对象当中,t都是动画参数
Ct:=plot::Circle2d(b, O_t(t), t=0..T):
Arc:=plot::Arc2d(b, O_t(t), t+PI..t+PI+a/b*t, t=0..T,
Color=RGB::Green, LineWidth=0.7):
Arrow1:=plot::Arrow2d([0,0], O_t(t), t=0..T):
Arrow2:=plot::Arrow2d(O_t(t), P_t(t), t=0..T):
Ot:=plot::Point2d(O_t(t), t=0..T, Color=RGB::Blue):
Qt:=plot::Point2d(Q_t(t), t=0..T, Color=RGB::Black):
Pt:=plot::Point2d(P_t(t), t=0..T, PointSize=2, Color=RGB::Red):
plot(C, Cc, Ct, Arc, Arrow1, Arrow2, Ot, Qt, Pt, #C);
Arrow3d

有向空间线段:

1
plot(plot::Arrow3d([0,1,0],[1,0,0]))

可以直接扔向量做点。其他元件可以类推。

Rectangle2d

plot::Rectangle(xmin .. xmax, ymin .. ymax, , options)
选项Filled=TRUE将对矩形的内部进行填充,默认的设置是Filled=FALSE。
可以通过LineStyle、LineWidth 和 LineColor来设置边界线的属性。

1
2
3
4
P1 := plot::Rectangle(-2..2, -2..2, Filled = TRUE
,FillColor = RGB::Red);
P2 := plot::Rectangle(1..5, 1..5, Filled = FALSE,
LineColor = RGB::Black, LineStyle = Dashed);
Polygon2d

plot::Polygon2d([pt2d1, pt2d2, …], )
LinesVisible:线是否显示,默认值是LinesVisible=TRUE,即显示线,此时可以设置以下图形属性:
· Color、LineStyle和LineWidth(默认值与plot ::Function2d的相同);
· Closed(默认值是Closed=FALSE,即终点[xn,yn]与始点[x1,y1]不连线);
Filled:内部是否填充,默认值是Filled=FALSE,即内部不填充,若修改成Filled=TRUE,则此时可以设置以下图形属性:
· FillColor(填充颜色,默认值是FillColor=RGB::Red);
· FillPattern(填充方式,默认值是FillPattern=DiagonalLines);
PointsVisible:点是否显示,默认值是PointsVisible=FALSE,即不显示点,若修改成PointsVisible=TRUE,则此时可以设置以下图形属性:
· PointSize(点尺寸,默认值是PointSize=1.5);
· PointStyle(点型,默认值是PointStyle=FilledCircles).

1
plot::Polygon2d([[cos(2*PI*k/5), sin(2*PI*k/5)] $ k = 0..4],Closed= TRUE,Filled=TRUE):
1
2
3
4
5
6
n:=3://取n=1,2,3,...
C1:=plot::Circle2d(1,[0,0],Color=RGB::Green):
P1:=plot::Polygon2d(
[[cos(2*PI*k/(6*2^(n-1))),sin(2*PI*k/(6*2^(n-1)))]
$k=0..(6*2^(n-1))],PointsVisible=TRUE,PointSize=1):
plot(C1,P1,AxesVisible=FALSE);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//五角星
r1:=2:
r2:=1:
lt:=[[r1*sin(PI*k*72/180),r1*cos(PI*k*72/180)]
$k=0..4,
[-r2*sin(PI*k*72/180),-r2*cos(PI*k*72/180)]
$k=0..4]:
lt3:=[lt[1], lt[9],
lt[2], lt[10],
lt[3], lt[6],
lt[4], lt[7],
lt[5], lt[8]]:
p1:=plot::Polygon2d(lt3, Closed=TRUE
,FillColor=RGB::Red,Filled=TRUE):
plot(p1,#C);
Box

命令plot::Box创建三维空间中长方体的图形对象,语法格式:

plot::Box(xmin..xmax, ymin..ymax, zmin..zmax, Attributes)

说明:

xmin..xmax, ymin..ymax, zmin..zmax:空间直角坐标 x, y, z 的取值范围,必须xmin<xmax, ymin<ymax, zmin<zmax;

Attributes:图形属性,可选项.

1
Bg:=plot::Box(-delta..delta, -delta..delta, -epsilon..epsilon,Color=RGB::Blue.[0.1]):
Circle2d

命令plot::Circle2d(r, [x, y])创建圆心在 (x, y)半径为r的2D圆对象,如果命令中没有给出圆心坐标,则默认将圆心设置在原点处。LinesVisible:线是否显示,默认值是TRUE,即显示,此时可以设置图形属性Color、LineStyle和LineWidth,默认值与命令plot ::Function2d相同;
Filled:内部是否填充,默认值是FALSE,即不填充,若修改成TRUE,则可以设置填充颜色FillColor,默认值是FillColor=RGB::Red.

1
2
3
C3 :=plot::Circle2d(3,[1, 1],Filled = TRUE,LineColor=RGB::Yellow,FillColor=[0.5,0.6,0.7]):
Point1:=plot::Point2d(1,1,PointSize=2):
plot(C3,Point1):
Cylinder

命令plot::Cylinder创建三维空间中圆柱体的图形对象,语法格式:

plot::Cylinder(r, [x1, y1, z1], [x2, y2, z2], Attributes)

说明:

r:圆柱体的半径;

[x1, y1, z1], [x2, y2, z2]:圆柱体的两个底面的圆心的三维坐标;

Attributes:图形属性,可选项

1
Cg:=plot::Cylinder(delta, [0,0,-epsilon],[0,0,epsilon], Color=RGB::Blue.[0.1]):
Arc2d

plot::Arc2d(r, [x, y], t1..t2, a=a1..a2, Attributes)
说明:
r:圆弧或扇形所在的圆的半径;
[x, y]:可选项,圆弧或扇形所在的圆的圆心的坐标,若缺省,默认值为原点的坐标[0, 0];
t1..t2:可选项,圆心角的范围,若缺省,默认值为0..2*PI,即完整的圆;
a=a1..a2:可选项,动画参数及其取值范围,既可以a1a2;
Attributes:可选项,修改图形属性的设置,本次实验需要用到以下图形属性:
(1) Closed=TRUE,显示圆弧以及圆心角的两条边(半径),也就是扇形的完整轮廓,
默认值是FALSE(仅显示圆弧);
(2) Filled=TRUE, 在扇形内填充阴影,默认值是FALSE(不填充);
(3) FillPattern=Solid,以默认的红色完全填充扇形内部,默认值是DiagonalLines(斜线).

1
2
3
4
5
6
7
8
9
10
11
float(A);
for j from 1 to 5 do
n:=2^j: //增加或减小正整数n的值,观察图形的变化
h:=PI/n:
t:=-PI/2+k*h:
S:=numeric::sum(1/2*r(t+h/2)^2*h, k=0..n-1):
print(j,n,S,float(S-A));
Fans:=plot::Group2d(plot::Arc2d(r(t+h/2), t..t+h, Closed=TRUE,Filled=TRUE, FillPattern=Solid)
$ k=0..n-1):
plot(Fans, Heart, Ly);
end;
Group2d

一组相似的图形:

1
2
3
delete k,x;
fff:=plot::Group2d(plot::Function2d(k*x,x=0..3) $ k=0..3)://4条直线
plot(fff);
Group3d

命令plot::Group3d生成一族三维图形对象,用此命令可以生成空间(直)线族或曲(平)面族,语法格式如下:

plot::Group3d(obj1, obj2, …, Attributes)

说明:obj1, obj2, …:多个三维图形对象,可利用序列运算符$简化重复性的代码.

Text2d

plot::Text2d(text, [x, y], , )
命令plot::Text2d常用的图形属性有以下这些:
1)TextFont:文本的字体,默认值是[“sans-serif”, 11];
2)TextRotation:文本的旋转角度,弧度制,默认值是0; //逆时针
3)HorizontalAlignment:文本相对于添加位置的水平方位,默认值是Left,另外还有Center和Right两种设置;
4)VerticalAlignment:文本相对于添加位置的垂直位置,默认值是BaseLine,另外还有Bottom、Center和Top三种设置.

1
Tex1 := plot::Text2d("cos(x) < sin(x)/x < 1", [-1.3,1.1]);
1
2
3
4
5
6
7
plot(plot::Rectangle(0..2, 0..4),
plot::Point2d([1, 2]),
plot::Text2d("Hello world!", [1, 2*a],
HorizontalAlignment = Left,
a=0.1..2, TextFont = [24]),
Axes = Frame, PointColor = RGB::Red,
PointSize = 3*unit::mm)//动画文本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
plot(plot::Circle2d(sqrt(2)),//旋转过的文本
plot::Text2d("Hello (1)", [ 1, 1],
HorizontalAlignment = Left,
TextRotation = PI/4),
plot::Text2d("Hello (2)", [ 1,-1],
HorizontalAlignment = Left,
TextRotation = -PI/4),
plot::Text2d("Hello (3)", [-1,-1],
HorizontalAlignment = Right,
TextRotation = PI/4),
plot::Text2d("Hello (4)", [-1, 1],
HorizontalAlignment = Right,
TextRotation = -PI/4),
HorizontalAlignment = Left, TextFont = [20])

字体属性和数据类型转str可以参见帮助文档,使用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ed:=6:
sc:=150:
txc:=[int2text(k)$k=1..ed-1].["..."]:
exenh:=plot::Group2d(plot::Line2d([k,k],[k,ed])$k=1..ed-1):
exenw:=plot::Group2d(plot::Line2d([k,k],[ed,k])$k=1..ed-1):
exonh:=plot::Group2d(plot::Line2d([-k,k],[-k,ed])$k=1..ed-1):
exonw:=plot::Group2d(plot::Line2d([-k,k],[-ed,k])$k=1..ed-1):
exanh:=plot::Group2d(plot::Line2d([-k,-k],[-k,-ed])$k=1..ed-1):
exanw:=plot::Group2d(plot::Line2d([-k,-k],[-ed,-k])$k=1..ed-1):
exunh:=plot::Group2d(plot::Line2d([k,-k],[k,-ed])$k=1..ed-1):
exunw:=plot::Group2d(plot::Line2d([k,-k],[ed,-k])$k=1..ed-1):
exent:=plot::Group2d(plot::Text2d(
"D".txc[k],[k-0.6,k-0.6])$k=1..ed):
exont:=plot::Group2d(plot::Text2d(
"D".txc[k],[-k,k-0.6])$k=1..ed):
exant:=plot::Group2d(plot::Text2d(
"D".txc[k],[-k,-k+0.3])$k=1..ed):
exunt:=plot::Group2d(plot::Text2d(
"D".txc[k],[k-0.6,-k+0.3])$k=1..ed):
s1:=plot::Point2d([0.6,1.7],Color=RGB::Blue):
s2:=plot::Point2d([-4.4,2.1],Color=RGB::Blue):
s3:=plot::Point2d([3.9,-3.2],Color=RGB::Blue):
st1:=plot::Text2d("P1",[0.4,1.8],TextFont=["serif",12,[0,0,1]]):
st2:=plot::Text2d("P2",[-5,2.3],TextFont=["serif",12,[0,0,1]]):
st3:=plot::Text2d("P3",[4.2,-3.5],TextFont=["serif",12,[0,0,1]]):
plot(exenh,exenw,exonh,exonw,exanw,exanh,exunh,exunw,
exent,exont,exant,exunt,s1,s2,s3,st1,st2,st3,
#C,#O,Color=RGB::Black,ViewingBox=[-ed..ed,-ed..ed],
Height=sc,Width=sc);
Surface

曲面

如果是平面的点位式方程,参数$s,t$,为:

plot::Surface([x0+ux*s+vx*t, y0+uy*s+vy*t, z0+uz*s+vz*t], s=smin..smax, t=tmin..tmax, a=a1..a2, Attributes)

Surface绘制正圆锥面效果最好。Implicit3d需要AdaptiveMesh且网格线不那么好

plot::Surface绘得的正圆锥面的图像,可看到曲面上显示的网格线由圆周(纬线)和直线(经线)组成,直线族恰好是直线 Lz 轴旋转有向角(k*pi/12,k=[0,23])z得到的,而圆周族是L的25个等距分布的点

在命令plot::Surface设置ULinesVisible=FALSE和VLinesVisible=FALSE,使得曲面上不显示参数曲线网格;
设置Submesh=[4, 4]额外增加采样点密度,并且使用RGBa值颜色,使得等值线更光滑.

设置图形属性FillColorType=Flat,即曲面颜色保持不变(系统默认值FillColorType=Dichromatic会使得色调随着竖坐标值增大而变暖).

在命令plot::Surface设置XContours=[$-ra..ra step a/2],使得在曲面上显示被平面族$x=-ra+\frac{ka}2\quad(k=0,1,\dots,4r)$截得的平行截线族.y,z,同理

举例:绘图观察单叶双曲面的 x 等值线

1
2
3
4
5
S:=plot::Surface([a*cos(u)*sec(v), b*sin(u)*sec(v), c*tan(v)],
u=0..2*PI, v=-arctan(r)..arctan(r),
Submesh=[4,4],ULinesVisible=FALSE, VLinesVisible=FALSE,
XContours=[$-r*a..r*a step a/2],LineColor=RGB::Black.[0.9]):
plot(S, #C);

所以可以换成:

1
2
YContours=[$-r*b..r*b step b/2]
ZContours=[$-r*c..r*c step c/2]//等高线和间距step

当然是可以一起出现的。

Hatch

Hatch(f)生成f(定义域内)与x围成的面积

1
2
3
Gv:=plot::Function2d(v(t), t=0..3, Color=RGB::Blue):
L3:=plot::Line2d([3,0], [3,v(3)], Color=RGB::Black):
plot(plot::Hatch(Gv), Gv, L3, YAxisTitle="v");
Integral

积分和(黎曼和)plot::Integral(F, n, a=a1..a2, Attributes)

可选方法有:

  • RiemannLower
  • RiemannLowerAbs
  • RiemannUpper
  • RiemannUpperAbs
  • RiemannLeft
  • RiemannMiddle
  • RiemannRight
1
2
3
4
delete j;
m:=8: n:=3*2^(j-1):
Rs:=plot::Integral(Gv,n,j=1..m,IntMethod=RiemannLeft, Frames=m):
plot(Rs, Gv, YAxisTitle="v");
XRotate

Oxy上曲线绕x旋转得到的立体

1
2
plot(plot::XRotate(sqrt(x),x=0..5,AdaptiveMesh=3))
//AdaptiveMesh加不加影响不大

同理有Oxz绕z轴的ZRotate。都默认开启#C

[返回曲面]

1
2
C:=plot::ZRotate(sqrt(3)/3*x, x=-1..1):
plot(C);
Rotate3d

plot::Rotate3d(angle, [x0, y0, z0], [vx, vy, vz], obj1, obj2, …, a=a1..a2, Attributes)

angle:给定的旋转角度,按右手规则约定旋转角的正方向,即右手拇指伸直,其余四指握拳,当拇指指向给定的旋转轴的方向$\vec v=(v_x,v_y,v_z)$,其余四指恰好指向旋转角的正方向;

[x0, y0, z0v], [vx, vy, vz]:可选项,分别是点和向量v的坐标(旋转轴经过点 P,以v为方向向量),默认值分别为[0, 0, 0](原点)和[0, 0, 1]( z 轴正方向),如果二者同时缺省,即以 z 轴为旋转轴,如果只缺省一个三元列表,系统只接受表示方向向量的第二项缺省,即以经过点 P 平行于 z 轴的直线为旋转轴;

obj1, obj2, …:一个或多个空间图形对象,从obj2开始是可选项;
a=a1..a2:可选项,动画参数及取值范围,既可以a1a2;
Attributes:可选项,修改某些图形属性的默认设置,其中选项Center=[x0, y0, z0]是旋转轴经过的已知点的坐标,选项Axis=[vx, vy, vz]是旋转轴的方向向量的坐标,默认值分别为[0, 0, 0]和[0, 0, 1].

[返回曲线]

1
2
3
L0:=plot::Curve3d([v, 0, sqrt(3)/3*v], v=-1..1, Color=RGB::Black.[0.9]):
L:=plot::Rotate3d(angle, [0,0,0], [0,0,1], L0, angle=0..2*PI):
plot(C, L0, L);

例题