建模笔记之 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);
公众号:湛岚宁的小屋