一些数学建模过程中使用的编程语言

matlab 基础

变量

无需声明,直接赋值

  • 变量名:大小写敏感,数字字母组成,不能以数字开头,保留关键词
  • 数组索引从1开始
  • 数字型变量显示格式 format <显示格式>
    • short 短定点格式显示小数点后4位
    • long 变量double类型显示小数点后15位
    • shortE/longE 科学计数法
    • bank 小数点后两位
    • hex 十六进制格式
    • rat 比例格式
  • matlab命令行
    • clc 清除终端
    • clear 清除当前工作区内所有变量
    • who 以简略格式显示工作区内所有变量
    • whos 复杂格式

matlab函数

  • 常用函数介绍

    • 三角函数:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      sin 正弦  										
      sinh 双曲正弦
      asin 反正弦
      asinh 反双曲正弦
      cos 余弦
      cosh 双曲余弦
      acos 反余弦
      acosh 反双曲余弦
      tan 正切
      tanh 双曲正切
      atan 反正切
      atanh 反双曲正切
  • 指数对数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    exp 指数   										
    log e为底的对数
    log10 常用对数
    sqrt 平方根
    abs 模或绝对值
    angle 幅角
    conj 复共轭
    Imag 虚部
    real 实部
    • 舍入函数:

      1
      2
      3
      4
      5
      fix0舍入  									
      floor 向负无穷舍入
      ceil 向正无穷舍入
      round 四舍五入
      rem(a,b) 计算a/b的余数
  • 有关向量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    min(x) 向量x的元素的最小值  						
    max(x) 向量x的元素的最大值
    mean(x) 向量x的元素的平均值
    median(x) 向量x的元素的中位数
    std(x) 向量x的元素的标准差
    diff(x) 向量x的相邻元素的差
    sort(x) 对向量x的元素进行排序
    length(x) 向量x的元素个数
    norm(x) 向量x的Euclidean长度
    sum(x) 向量x的元素总和
    prod(x) 向量x的元素连乘积
    cumsum(x) 向量x的累计元素和
    dot(x,y) 向量x和y的内积
    cross(x,y) 向量x和y的外积
    cumprod(x) 向量x的累计元素总乘积

matlab矩阵运算

  • 矩阵输入最简单的方法是把矩阵的元素直接排列在方括号中。每行内的元素用空格或者逗号隔开,行与行之间用分号隔开
  • 索引竖着 A=[1,2,3;4,5,6;7,8,9]; A(8)=A(2,3)=6
  • 矩阵的转置 >> A’
  • 矩阵的加减 >> A+B
  • 矩阵的乘法 >> A*B
  • 矩阵的行列式 >> det(A)
  • 矩阵求秩 >>rank(A)
  • 矩阵求迹 >>trace(A)
  • 矩阵求逆 >> inv(A) 利用逆矩阵可以解方程组AX=b
    • >> A = [1,1,3;4,6,6;7,1,9]
    • >> inv(A)*b / >> A\b
  • 矩阵的特征值 >> eig(A) >> [X,V] = eig(A) X:特征向量 V:特征值

控制流程

  • if语句:

    1
    2
    3
    4
    5
    6
    7
    if condition1
    statement1
    elseif condition2
    statement2
    else
    statement3
    end
  • switch语句:

    1
    2
    3
    4
    5
    6
    7
    8
    switch expression
    case value1
    statement1
    case value2
    statement2
    otherwise
    statement
    end
  • while语句:

    1
    2
    3
    wihle expression
    statement
    end
  • for语句:

    1
    2
    3
    for variable = start:increment:end
    commands
    end

封装函数

1
2
3
4
function [输出变量名] = 函数名(输入变量)
% 函数的文档

函数代码
  • function是一个关键字,声明该文件中保存的是一个函数
  • 输入变量和输出变量是非必须的,函数既可以没有输入变量,也可以没有输出变量
  • 函数名应与.m文件名相同,且不包含特殊字符

以函数句柄形式定义函数

1
2
3
4
5
函数句柄 = @(输入变量) 输出变量

f = @(x) exp(-2*x)
x = 0:0.1:2
plot(x,f(x))

函数作图

1
2
3
x = [0:0.01:10]
y = sin(x)
plot(x,y,'-r*')
  • plot(x)

  • plot(x,y,参数)

  • plot(x1,y1,x2,y2,,,,,,xn,yn)

  • 参数:

    1
    2
    3
    '-':实线  ‘:’:虚线  '-.':点划线  ‘--’:双划线  
    'k':黑色 'b':蓝色 'c':蓝绿色 'g':绿色 'm':洋红色 'r':红色 'w':白色 'y':黄色
    '*':星号 'o':圆圈 's':方块 'p':五角星 '^':上三角 'X':叉 '+':+ 'd':菱形 'v':下三角 '<':左三角 '>':右三角 'H':六角形
  • 函数句柄:

    1
    fplot(@(x)sin(X),[0,10],'-r')
  • 对数坐标图:

    1
    2
    3
    semilogx(x1,y1,'参数',x2,y2,'参数')
    semilogy(x1,y1,'参数',x2,y2,'参数')
    loglog(x1,y1,'参数',x2,y2,'参数')
  • 极坐标图:

    1
    polar(theta,rho,'参数')
  • 条形图:

    1
    2
    bar(y,style)
    bar(x,y,style)
  • 直方图:

    1
    2
    hist(y)
    hist(y,x)
  • 面积类图形:

    1
    pie(x,explode)
  • 散点类图形:

    1
    scatter(x,y,选项,'filled')
  • 矢量类图形:

1
2
3
4
5
6
7
8
9
10
11
%已知向量A,B,求A+B,并用矢量图表示
A = [4,5]; B = [-10,0]; C = A+B;
hold on
quiver(0,0,A(1),A(2));
quiver(0,0,B(1),B(2));
quiver(0,0,C(1),C(2));
text(A(1),A(2),'A');
text(B(1),B(2),'B');
text(C(1),C(2),'C');
axis([-12,6,-1,6])
grid on

显示微分方程

1
[𝒕,𝒙] = 𝒔𝒐𝒍𝒗𝒆𝒓(′𝒐𝒅𝒆𝒇𝒖𝒏 ′ , 𝒕𝒔, 𝒙𝟎 , 𝒐𝒑𝒕𝒊𝒐𝒏𝒔)
  • t 自变量

  • x 函数值

  • solver 显示函数一般有ode45 、ode23 、ode113、ode15s、ode23s

  • odefun 微分方程文件,使用’’或@

    1
    2
    3
    4
    % 定义函数文件
    function yp=funt(t,y)
    yp=(y^2-t-2)/4/(t+1);
    end
  • ts 自变量范围

  • x0 函数初值

  • option 用于设定误差限 options=odeset(‘reltol’, rt,’abstol’,at)

    • rt 相对误差
    • at 绝对误差
  • 若是高阶微分方程,改写长一介常微分方程组

Lingo

生成一维矩阵

1
2
3
4
sets:
factory /1..6/:a,b;
plant /1..3/ :x,y;
endsets
  • factory 和 plant 都是制造矩阵的工厂,但它们是两家不同的工厂。
  • factory 工厂最后面出现的 ab都是 1*6的矩阵。

矩阵赋值

1
2
3
4
5
6
7
sets:
factory /1..6/ :a,b;
endsets
data:
a=1,2,3,4,5,6;
b=1.0,5.0,4.0,3.0,2.0,1.0;
enddata
  • 不是每个矩阵都要赋值
  • 需要赋值的矩阵必须赋满

循环语句

1
@for(factory:执行语句);
  • for循环内先写工厂,告诉for循环几次

sum求和

1
@sum(factory:累加内容);
例子
1
2
3
4
5
6
7
8
9
10
11
model:
sets:
gc /1..5/:a.x;
endsets
data:
a=1,2,3,4,5;
enddata
max=S;
@for(gc(i):a(i)*x(i)=S);
@sum(gc(i):x(i))=5000
end

生成二维矩阵

1
2
3
4
5
sets:
factory /1..6/:a;
plant /1..8/:d;
Cooperation(factory,plant):c,x;
endsets
  • cooperation(a,b)用于合并,如上c,x为6*8
函数名 作用
@for( factory:a>0) 循环
@sum(factory: a) 求和
@prod(factory: a) 求积
@max(factory: a) 求最大值
@min(factory: a) 求最小值
@in(factory: a) 判断是否在其中
@size(factory) 工厂长度