建模笔记之 maple 学习
本笔记主要介绍基本的方程组求解,对于语法、画图功能不加以阐述。在数学建模中,大部分的编程工作还是由matlab或python来完成,而maple可以快速解决一些需要手算的操作。比如建模国赛18年的A题隔热服的问题,掌握maple就会简单的多。
若想更深入的学习,可以看看这个博客。http://blog.sina.com.cn/s/articlelist_1525587631_5_1.html
在学习的过程中,建议多使用maple自带的帮助,里面也提供了一些简单易懂的例子
- % 代指上一个公式
- ifactor
分解的意思,颇有最小公倍数的意味。
ifactor(60);
- expand
展开
expand((x + 1)*(x + 2));
- evalf
将结果转化为浮点数,也有求解的意思,求解后直接化为浮点数
2^30*sqrt(3); evalf(%);
- sum
求和
sum((1 + i)/(i^4 + 1), i = 1 … 100); evalf(%);
- product
连乘
product( ((i^2+3*i-11)/(i+3)), i=0…10 );evalf(%);
- 发现个规律,sum和product也可以写成Sum和Product,即第一个英文字母大写,若写成Sum时,Maple出来的结果带着∑,而不是数值,例:
Sum((1 + i)/(i^4 + 1), i = 1 … 100); value(%);evalf(%)
- 或
Sum((1 + i)/(i^4 + 1), i = 1 … 100); evalf(%)
- 或
sum((1 + i)/(i^4 + 1), i = 1 … 100); evalf(%)
- product同理
- value
化简、求值,可以求解sum、product、limit等
Sum( 1/k^2, k=1…infinity ); value(%);
- factor
合并
expr := (x + y)^15; expand(expr);factor(%);
- simplify
化简 - normal
化简 - eval
相当于求解,返回表达式计算结果
expr1 := (41x^2 + x + 1)^2(2*x - 1);
eval(expr1, x = 1);
- 用来检验计算方程在特殊点x的值
eqn:=x3-1/2*a*x2+13/3*x^2=13/6*a*x+10/3*x-5/3*a;
eval(eqn , x=1/2*a );
- :=
定义变量
expr1 := (41*x2+x+1)2*(2*x-1);
- 定义函数
f := x -> x^2 + 1/2;
- unapply
使用unapply命令将表达式转化为函数
g := unapply(x^2 + 1/2, x); g(2);
- 解方程(组)
eqn1 := a+2*b+3*c+4*d+5*e=41;
eqn2 := 5*a+5*b+4*c+3*d+2*e=20;
eqn3 := 3*b+4*c-8*d+2*e=125;
eqn4 := a+b+c+d+e=9;
solve( {eqn1, eqn2, eqn3, eqn4}, {a, b, c, d} ); # 用变量e来表示其他未知数a,b,c,d,得到一组解
solve((ab+bc=c),{c}); #用a、b来表示c
- 解不等式
ineq := x+y+4/(x+y) < 10: # 此处的:类似于matlab的循环运算里的冒号,不过也可以改成分号
solve( ineq, {x} );
{solve({x^2 = 9, x + y < 10}, {x, y})};
- 微积分
f := x -> xsin(ax) + b*x^2; #定义函数
diff(f(x), x); #求导
int(f(x), x); #不定积分
int(f(x), x = 1 … 2); #定积分
- 三重积分
Int(Int(Int(1, x = 0 … 1), y = 0 … 2), z = 0 … 3);
value(%);
- 求极限
expr := (2x + 3)/(7x + 5); #定义表达式
limit(expr, x = infinity); #求函数式在正无穷处的极限
- 展开为级数和转化为多项式
expr := sin(4*x)*cos(x): #定义表达式
approx1 := series( expr, x=0 ); #展开为级数
poly1 := convert( approx1, polynom ); #转化为多项式
- diff
求解微分方程
格式为 dsolve({equn,conds},y(x)); 其中equn为方程 conds为条件
ode := diff(x(t), t) = 2*x(t); #maple中因变量必须连同它的自变量一起出现,即x(t)不能简写成x
#ode表示微分方程x‘(t)=2*x(t)
dsolve(ode, x(t)); #给出通解
dsolve({ode, x(0) = 3}, x(t)); #给出特解
- 对于一阶常微分方程 可用dsolve直接求得解析解
ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);
dsolve(ODE, y(x));
- 对于上面例题,必须用y(x)而不能用y,这一点有区别于我们平时的书写方法,为了使其与我们的习惯一致, 可用alias将函数用别称表示:
alias(y = y(x));
ODE := x*diff(y, x) = y*ln(x*y) - y;
dsolve(ODE, y);
- 求解微分方程组
格式为 dsolve({sysODE, ICs}, {funcs}); sysODE为方程组,ICs为条件组
sys := {diff(x(t), t) = x(t) + y(t), diff(y(t), t) = y(t) - x(t)}; #定义微分方程组
dsolve(sys, {x(t), y(t)}); #求解
ode1 := 2*diff(x(t), t $ 2) + 2*x(t) + y(t) = 2*t; #定义第一个二阶方程
ode2 := diff(y(t), t $ 2) + 2*x(t) + y(t) = t^2; #定义第二个二阶方程
dsolve({ode1, ode2, x(0) = 0, y(0) = 0, D(x)(0) = 1, D(y)(0) = 0}, {x(t), y(t)});
#求解,分别给出x、y的一阶导数和原函数的特值
- 主次迭代法
已知y’=1+y^3,y(0)=1,求原函数
- 普通方法代码如下:
ode := diff(y(x), x) = 1 + y(x)^3;
dsolve({ode, y(0) = 1}, y(x));
- 输出结果
y(x) = sqrt(3)tan(RootOf(sqrt(3)ln(4/(3(tan(_Z)^2 + 1))) + 2sqrt(3)*ln(3/2 + sqrt(3)tan(_Z)/2) - 2sqrt(3)ln(2) - Pi - 6sqrt(3)x + 6_Z))/2 + 1/2
- 发现这根本不是常见的结果,在这里,我给大家推荐另外一种方法,主次迭代法。
该问题的等价积分方程为:
ode1 := y(x) = 1 + int(1 + y(x)^3, x = 0 … x);
- 并利用maple去进行重复的迭代:
y0 := 1;
y1 := 1 + int(x^2 + y0^2, x = 0 … x);
y2 := 1 + int(x^2 + y1^2, x = 0 … x);
y3 := 1 + int(x^2 + y2^2, x = 0 … x);
y4 := 1 + int(x^2 + y3^2, x = 0 … x);