建模笔记之 maple 学习

本笔记主要介绍基本的方程组求解,对于语法、画图功能不加以阐述。在数学建模中,大部分的编程工作还是由matlab或python来完成,而maple可以快速解决一些需要手算的操作。比如建模国赛18年的A题隔热服的问题,掌握maple就会简单的多。

若想更深入的学习,可以看看这个博客。http://blog.sina.com.cn/s/articlelist_1525587631_5_1.html

在学习的过程中,建议多使用maple自带的帮助,里面也提供了一些简单易懂的例子

  1. % 代指上一个公式
  2. ifactor
    分解的意思,颇有最小公倍数的意味。

ifactor(60);

  1. expand
    展开

expand((x + 1)*(x + 2));

  1. evalf
    将结果转化为浮点数,也有求解的意思,求解后直接化为浮点数

2^30*sqrt(3); evalf(%);

  1. sum
    求和

sum((1 + i)/(i^4 + 1), i = 1 … 100); evalf(%);

  1. product
    连乘

product( ((i^2+3*i-11)/(i+3)), i=0…10 );evalf(%);

  1. 发现个规律,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(%)

  1. product同理
  2. value
    化简、求值,可以求解sum、product、limit等

Sum( 1/k^2, k=1…infinity ); value(%);

  1. factor
    合并

expr := (x + y)^15; expand(expr);factor(%);

  1. simplify
    化简
  2. normal
    化简
  3. eval
    相当于求解,返回表达式计算结果

expr1 := (41x^2 + x + 1)^2(2*x - 1);
eval(expr1, x = 1);

  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 );

  1. :=
    定义变量

expr1 := (41*x2+x+1)2*(2*x-1);

  1. 定义函数

f := x -> x^2 + 1/2;

  1. unapply
    使用unapply命令将表达式转化为函数

g := unapply(x^2 + 1/2, x); g(2);

  1. 解方程(组)

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

  1. 解不等式

ineq := x+y+4/(x+y) < 10: # 此处的:类似于matlab的循环运算里的冒号,不过也可以改成分号

solve( ineq, {x} );

{solve({x^2 = 9, x + y < 10}, {x, y})};

  1. 微积分

f := x -> xsin(ax) + b*x^2; #定义函数

diff(f(x), x); #求导

int(f(x), x); #不定积分

int(f(x), x = 1 … 2); #定积分

  1. 三重积分

Int(Int(Int(1, x = 0 … 1), y = 0 … 2), z = 0 … 3);

value(%);

  1. 求极限

expr := (2x + 3)/(7x + 5); #定义表达式

limit(expr, x = infinity); #求函数式在正无穷处的极限

  1. 展开为级数和转化为多项式

expr := sin(4*x)*cos(x): #定义表达式
approx1 := series( expr, x=0 ); #展开为级数
poly1 := convert( approx1, polynom ); #转化为多项式

  1. 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)); #给出特解

  1. 对于一阶常微分方程 可用dsolve直接求得解析解

ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);

dsolve(ODE, y(x));

  1. 对于上面例题,必须用y(x)而不能用y,这一点有区别于我们平时的书写方法,为了使其与我们的习惯一致, 可用alias将函数用别称表示:

alias(y = y(x));

ODE := x*diff(y, x) = y*ln(x*y) - y;

dsolve(ODE, y);

  1. 求解微分方程组
    格式为 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的一阶导数和原函数的特值

  1. 主次迭代法

已知y’=1+y^3,y(0)=1,求原函数

  1. 普通方法代码如下:

ode := diff(y(x), x) = 1 + y(x)^3;

dsolve({ode, y(0) = 1}, y(x));

  1. 输出结果

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

  1. 发现这根本不是常见的结果,在这里,我给大家推荐另外一种方法,主次迭代法。

该问题的等价积分方程为:

ode1 := y(x) = 1 + int(1 + y(x)^3, x = 0 … x);

  1. 并利用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);