Matlab
%投点画圆
r=10;
t=linspace(0,2*pi,100);%转动角度离散化
X=r*(t-sin(t)); Y=r*(1-cos(t));%计算摆线一拱离散点的坐标
for k=1:length(t)%循环
hold off
plot(X(1:k),Y(1:k),'.','linewidth',3)%绘制摆线上离散点
x0 = X(k)+r*sin(t(k)); y0=r; % 圆心
x1 = x0+ r*cos(t); y1=y0+r*sin(t); % 圆的坐标(x1,y1)
hold on,
plot(x1,y1,'linewidth',3) % 绘制圆
axis([-r, (2*pi*r+r), 0, 2*r])% 坐标范围。
axis equal%让横纵坐标比例相同
axis square%横纵坐标比例不一定相同,但是图一定是正方形。
set(gca,'fontsize',14,'linewidth',3), pause(0.05)
end
Linspace(start,end,n)----分成n份。
- 基础
help 函数名
%注释
语句后加;不显示结果
clc 清空命令行窗口,clf 清除figure上图像。
MATLAB的处理对象是矩阵。没有布尔类型,但是以非0表示真,0表示假
本身自带的量:pi——π的近似值
i,j——虚数单位
inf,Inf——无穷大
命令行窗口:
内存变量的显示——who, whos(内容更详细)
内存变量的删除——clear, clear 变量名列表 (多个之间用空格隔开)
.load 是覆盖的写入,要想追加,则加上 空格-append
save 文件名 [变量名列表]
load 文件名 [变量名列表]
% a=fix(100*rand(3,5));
% b=round(10*rand(3,2));
% c=-10+floor(20*rand(3,3));
% d=-100+ceil(30*rand(4,4));
% save test.mat a b c d
% clear
% whos
% load test.mat
- 矩阵
矩阵:[]括起来,同一行元素用空格或逗号隔开,不同行用分号隔开,注意合法性
向量:start:step:end,省略步长,默认=1
linspace(start,end,number)与 start:(end-start)/number:end等价
下标(subscript)和序号(index)——按列编号
A=[1,2,3;4,5,6;7,8,9];
>> A([2,4])
ans = 4 2
冒号表达式:
A(:,j)——第j列
A(i:i+m,:)——第i到i+m行
A(i:i+m,j:j+n)——i到i+m行j到j+n列交叉的部分
A(:)将矩阵的元素按列叠成一个列向量
利用空矩阵删除矩阵元素
方阵A的行列式|A|——det(A)
特征值与特征向量eigenvalue ——eig(A)
- 运算:
算术运算+、-、*、/、\、%、^
注意: 这些算术运算是在矩阵意义下进行的,单个数据的算术运算只是一个特例
±运算规则:矩阵维数一致,对应元素±,否则出错,但是标量和矩阵可以进行运算,矩阵的每个元素和标量均进行±
乘运算规则:矩阵要可乘的,遵循矩阵乘法规则(前一个的列数等于后一个的行数),矩阵和标量可乘,矩阵的每个元素均和标量相乘
/、\规则: 对于矩阵而言,是左除与右除的区别,A / B = A ∗ i n v ( B ) , A\B = i n v ( A ) ∗ B,注意除数与被除数.对于标量而言,线上面的是被除数,线下面的是除数。
求逆的方式解线性方程组
Ax=b
x=A\b=inv(A)*b
Inv()是求逆矩阵,x’是矩阵转置。
标量可同时为除数与被除数,单独为除数,但不能单独为被除数
^规则:A ^x,要求A为方阵(标量为特例),x为标量
点运算:
.* , .\, ./, .^
矩阵的点运算,如果矩阵维数一样,则对应元素进行运算
当有标量时,标量和矩阵的每个元素进行运算
尤其乘方:
A ^x , A . ^B , A. ^x, x . ^A
A,B表示矩阵(标量,向量是特例),x为标量
当A,B不是标量时A,B需至少有一维相同,矩阵则对应元素乘方
向量与矩阵.^时,行向量时矩阵每行均与行向量对应元素乘方,列向量时,矩阵每列均与列向量对应元素乘方
A =
1 2 3
4 5 6
7 8 9
>> A^2
ans =
30 36 42
66 81 96
102 126 150
>> A.^2
ans =
1 4 9
16 25 36
49 64 81
关系运算:
比较量为标量时,直接比较大小,成立返回1,否则返回0;
为同维度矩阵时,对应元素进行关系运算;
标量与矩阵则标量与矩阵的每个元素进行关系运算。
逻辑运算:&,|,~
涉及矩阵的运算且要的是对应元素进行运算时要注意使用点运算,尤其是和函数一起时不要忘记了
- 函数
find(返回非零元素的位置,给定两个接受变量得到下标索引,不给定或者给一个得到序号索引)
all 若向量的所有元素非零,则返回1
abs:可以求实数的绝对值,复数的模,字符串的ASCII
fix,round,ceil,floor:fix直接去掉小数部分,round四舍五入,ceil向上取整,floor向下取整
size(A)——返回矩阵的行数和列数
length(A)——=max(size(A))
Zeros------全为0的矩阵
Ones------全为1的矩阵
Eye------对角线为1,其他位置元素为0.
rand(产生0~1间均匀分布的随机矩阵)
randn(产生均值为0,方差为1的标准正态分布随机矩阵)
normrnd生成正态分布随机数。
exprnd需要用 exprnd 函数生成大量符合指数分布的随机数样本.
例:学生到达时间服从指数分布。
clear all
i=1;
arrival(1)=exprnd(5);
while arrival(i)<30*60
i=i+1;
Tspace=exprnd(5);
arrival(i)=arrival(i-1)+Tspace;
end
plot(1:i,arrival,'.');
i
x=normrnd(20,2,1,N);----生成1*N个
>> a=normrnd(0,1)
a =-1.4814
用法(以zeros为例):
zeros(m)——mxm矩阵
zeros(m,n)——mxn矩阵
zeros(size(A))——和矩阵A同大小的矩阵
f=zeros(size(x));//f与x同大小,可以用来存储每个x(i)对应的f(x(i))。
建立随机矩阵:
[a,b]均匀分布的n阶随机矩阵: r a n d ( n ) ∗ ( b − a ) + a 均值为μ,方差为μ+σ∗randn(5)
在[20,50]均匀分布的5阶随机矩阵: r a n d ( 5 ) ∗ 30 + 20
均值为0.6方差为0.1的5阶正态分布的随机矩阵:
0.6 + s q r t ( 0.1 ) ∗ r a n d n ( 5 ) -------randn默认产生标准正态分布。
- 程序:
数据输入 x=input(提示信息)
数据的输出 disp
fprintf("x(%d)=%d\n",i,x(i))%fprintf(写入)
for i=1:1:10 语句 end
注意:在for循环体里面改变循环变量对最终的结果没有影响,因为在i=1:1:10中会被重新赋值
while 语句 end
- 符号计算:
建立符号变量与符号常量
%sym函数
>> x=sym('x') %定义符号变量
x =
x
>> k=sym('8') %定义符号常量
k =
8
>> x+k
ans =
x + 8
>> whos
Name Size Bytes Class Attributes
ans 1x1 8 sym
k 1x1 8 sym
x 1x1 8 sym
%syms命令——sym函数一次只能定义一个符号变量,使用syms命令一次可以定义多个符号变量,格式 syms a b c d...
>> syms x y z
>> whos
Name Size Bytes Class Attributes
x 1x1 8 sym
y 1x1 8 sym
z 1x1 8 sym
- 符号函数
符号对象在微积分中应用很多,常见的符号函数有求极限limit,求导diff,求积分int,求级数symsum,求泰勒级数——taylor,代数方程/方程组solve。
- 字符串
s=sprintf('%s birth:%d',name,birth)
s = 'lisi birth:2002'
字符串查找:strfind
s1='This is a book.';
s2='is';
p=strfind(s1,s2)
字符串替换:strrep
s1='This is a book.';
s2='is';
result=strrep(s1,s2,'nice')
result = 'Thnice nice a book.'
字符串分离:strsplit
R=strsplit(s1,' ')
R = 1×4 cell 数组
'This' 'is' 'a' 'book.'
以空格为分隔符,将原本的字符串分隔为字符数组。 . , ? 可以做分隔符
字符串拼接:横向拼接strcat、纵向拼接strvcat
a=strcat(s1,s2)
a = 'This is a book.is'
b=strvcat(s1,s2)
b = 2×15 char 数组
'This is a book.'
'is '
strtok(s1,' ')----strtok 从不是空白的第一个字符开始,包括直到下一个空白字符前(不包括该空白字符)的所有字符。
strtok(s1,' ')
ans = 'This'
num2str相当于num to str,把数组转换为字符串
V=[11 45 66 23 35]
s=num2str(V)
s = '11 45 66 23 35'
Str2num字符串转为数组
s1=str2num(s)
s1 = 1×5
11 45 66 23 35
reshape重构函数,reshape(A,size)
练习:
已知A=fix(100*rand(6,10));请将其转为20行3列的数组B,并将B保存为一个char数组
B = reshape(A,sz)重构函数
A=fix(100*rand(6,10));
B = reshape(A,20,3);
c=num2str(B)
- 绘图:
二维图形:
将平面坐标上的数据点连接起来的平面图形
1.绘制二维曲线的基本函数
plot
plot(x,y)
plot(x,y,选项)
plot(x1,y1,x2,y2,…)//一次画两条线。
plot(x1,y1,选项1,x2,y2,选项2,…)
选项:线型(-,:,-·,–),颜色(b,y,g,w,k,等),标记符号(*,p,d,s,+等)选项,这些选项放在一个引号里面
plot(x,sin(x),'r-..',x,2*sin(x),'b-.*')%多条曲线
plot(x,sin(x),'r','linewidth',3,'marker','<','Color','b','markersize',14)
双纵坐标plotyy(x1,y1,x2,y2)
2.绘制图形的辅助操作
1).图形标注
title(图像名称)----title('exp图形')%加标题
xlabel(x轴说明)
ylabel(y轴说明)
text(x,y,图形说明)——给点打标记
legend(图例1,图例2,…)
legend('sinx','2*sinx')%给图加注释
2).坐标控制
grid on/off 显示/不显示网格线
grid 两种状态中进行切换
box on/off 坐标加边框
box
3).图形保持
hold on/off
4).图形窗口分割
subplot(m,n,p)
将窗口分成m×n个绘图区,区号按行优先,且选定第p个区作为当前活动区。
3.绘制二维曲线的其他函数
极坐标图:polarplot(theta,rho,选项)
theta=linspace(0,2*pi,100);
polarplot(theta,2*sin(theta),'r');grid off;//不显示网格
对函数自适应采样的绘图函数fplot
fplot(filename,lims,相对允许误差tol,选项)
%eg fplot(@sin,[0,2pi]) ,fplot(@(x) sin(x) ,[0,2pi])
三维图形:
曲线就用’-’做连接符号
1.绘制三维曲线的基本函数:曲线是点的连接,不需要分布网格,不需要填充面。
plot3(x,y,z,选项)
plot3(x1,y1,z1,选项1,…)
和plot类似
t=linspace(0,10*pi,500);
plot3(sin(t),cos(t),t,'r-')
2.三维曲面
先要生成平面网格坐标矩阵
[X,Y]=meshgrid(x,y) #将向量坐标x,y变成平面网格坐标X,Y
x=1:6;y=1:8;
[x,y]=meshgrid(x,y)%将x和y分别扩充为八行6列
x = 8×6
[x,y]=meshgrid(-2:0.2:2)
X=21*21
z=x.*exp(-x.^2-y.^2);//利用函数公式计算函数值矩阵Z
mesh(x,y,z)
meshc投影等高线到底面。------对应contour,直接只画地面那个二维的等高线。
meshz下方全部实心。
Contour3画三维的等高线。
surf(X,Y,Z)函数还对颜色数据使用Z,因此颜色与高度成比例。
- 标准三维曲面
Sphere-----球形
[x,y,z]=sphere(n) 将产生(n+1)×(n+1)矩阵x,y,z采用这三个矩阵可以绘制圆心位于原点、半径为1的单位球体,n决定了球面的圆滑程度,默认值为20.
[x,y,z]=sphere(50);%括号里的数字决定了矩阵的维度。
mesh(x,y,z)
axis equal
[x,y,z]=cylinder(R,n)----用来绘制三维圆柱图。
R是一个向量,存放柱面各个等间距高度上的半径,n表示在圆柱圆周上有n个间隔点,默认20
[x,y,z]=cylinder([2,3,8,9,10,8,7,3,2],50);
mesh(x,y,10*z)
axis equal
4.隐函数绘图
如果给定函数的显示表达式,则可以先设置自变量向量,在根据表达式求得函数值,利用plot函数绘制曲线,但是若给定的函数是隐式表示的,则难用plot绘制,plot需要x值和y值。
表达式,自变量及范围,[xmin xmax ymin ymax]
ezplot('exp(-0.5*x)*sin(5*x)',[0,10,-1,1])
对于函数y=f(x),ezplot(f) 在默认区间-2π<x<2π绘制y=f(x)的图形
ezplot(f,[a,b])在区间a<x<b绘制
对于隐函数f(x,y)=0,ezplot(f) 在默认区间 -2π<x<2π和-2π<y<2π绘制f(x,y)=0的图形
ezplot(f,[xmin,xmax,ymin,ymax])
对于参数方程 x=x(t), y=y(t),ezplot(x,y) 在默认区间 -2π<t<2π,绘制x=x(t),y=y(t)图形,ezplot(x,y,[tmin,tmax])
其他隐函数绘图函数还要ezpolar,ezcontour,ezplot3,ezmesh,ezsurf
三维的常用的是参数方程
ezplot3(x,y,z)
ezsurf(x,y,z,[smin,smax,tmin,tmax])
注: 函数可以是引号直接括起来的字符串
- 绘制动画
%准备工作代码
for i=1:numframe
%完成动画所需要的计算、数据处理
hold off
%第一次绘制图片的代码
hold on
%其余绘图代码
end
axis设置图片可视范围
close all
%A B C
P=[1 2 1.5
0 0 1.5];%第一行是x坐标,第二行是y坐标
for i=1:100
t=0.1;
M=[cos(t) -sin(t);sin(t) cos(t)];%旋转矩阵
PP=M*P;
plot(PP(1,[1:3 1]),PP(2,[1:3 1]))%让坐标从哪出发回到哪里,首尾相连。
hold on
plot(0,0,'o','markersize',16);
axis equal%调整坐标规范
axis([-3 3 -3 3])%坐标范围
pause(0.1)
P=PP;%更新坐标
hold off
end
- 数值分析
1.solve求解方程/方程组(不涉及微积分运算)
格式:
syms 符号变量(要求解的变量)
solve(方程左边==方程右边,符号变量)
- 求解方程x 2 − x − 6 = 0
syms x;
x=solve(x^2-x-6==0,x)
- 求方程组y 2 + x − 6 = 0 , x 2 + y − 6 = 0 的解
syms x y ;
[x,y]=solve(x^2+y-6==0,y^2+x-6==0,x,y)
- fsolve/fzero求解非线性方程/方程组
fsolve(fun,x0),fun为待求方程(组),使用@函数句柄,x0为初始值,fzero类似
例子:
(1)求方程x − e − x = 0
x=fsolve(@(x) x-exp(-x),0)
(2)求方程组x 1 − 0.5 s i n x 1 − 0.3 c o s x 2 = 0 , x 2 − 0.5 c o s x 1 + 0.3 s i n x 2 = 0
x=fsolve(@fun,[0.1,0.1]) //两个函数使用函数句柄。
function f=fun(x)
f(1)=x(1)-0.5*sin(x(1))-0.3*cos(x(2));
f(2)=x(2)-0.5*cos(x(1))+0.3*sin(x(2));
(3)求解x 2 e − x 2 = 0.2
x=fzero(@(x) x^2*exp(-x^2)-0.2,0)
注意:fzero: 在区间[a,b]上寻根。需要f(a)*f(b)<0,即在区间两端函数值异号。
- 常微分方程的数值解
ode函数,常用的求解函数
ode23只能求解一阶
[T,Y]=ode23('F',Tspan,yo)
F是包括函数文件名字的字符串或函数句柄
Tspan是求解区域【t0,tN】
y0是初始条件,Tspan区间的第一个值对应的函数值为y0。
返回值T是存储自变量的结点,Y对应函数值。
% function exp3
% [T,Y]=ode23(@model,0:0.1:10,10)
% plot(T,Y,'o')
% Y(10)
% function r=model(t,y)
% r=0.02*(1-0.001*y)*y;
function exp_3_1_2
[t,x]=ode23(@model,0:1:100,[2;0]);
x(:,1)'
plot(t,x(:,1),'-o');
function r=model(t,x)
r=[x(2);
20*(1-x(1).^2)*x(2)+0.5*x(1)];
function f=f(x,y)
f表示dy/dx
常微分方程组求解则是将因变量y和导函数f当作向量处理即可;涉及高阶导,则需要降阶成为一阶。
ode15s(@fun,[0,1],[1,3])
function f=fun(x,y)
d1y=y(2);
d2y=2.*x.*d1y./(1+x.^2);
f=[d1y;d2y];
End
5.欧拉法解常微分方程
导数已知,相当于就是不断加梯度,得到函数Y
例:
t=linspace(0,10,200);%节点
y = zeros(size(t));%存储
y(1)=1;
h=t(2)-t(1);%步长
for j=2:200
y(j)=y(j-1)+h*(t(j-1)-2*y(j-1));%未知函数的导数
end
y(200)
//ans = 4.7500
plot(t,y,'o')
T = linspace(0,30,500)';%先定节点
Y = zeros(size(T));%分配存储
h = T(2)-T(1);%步长
f = @(t,y)t-2*y;%未知函数的导数
Y(1) = 1;%
for i=2:length(T)
Y(i) = Y(i-1)+h*f(T(i-1),Y(i-1));
end
Y(200)
ans = 5.7320
plot(T,Y,'r-')
- 微积分应用
- 函数极限------limit
limit函数:a为极限点,’left’,'right’表示左,右极限。含有符号对象的函数表达式f
limit(f,x,a,‘left’),limit(f,x,a,‘right’)
limit(f,x,a)双侧极限
limit(f)只有一个参数时指函数趋于0的极限
syms x a
f=(1+a/x)^x;
T1=limit(f,x,inf,'left') //正无穷
syms n
f=n*(1-sqrt((2*n-1)/2/n));
T4=limit(f,n,inf) //无穷
- 导数-------diff
diff(f,x,n) 表示求函数f关于变量x的n阶导数,n=1时可省略,f和x都使用符号对象
syms x
f=log((x+2)/(1-x));
T1_dy=diff(f,x)
T1_d3y=diff(f,x,3)
利用diff求偏导数,参数方程导数,隐函数方程导数。
Z=f(x,y),对z求x得偏导,就是diff(f,x)
y=y(t),x=x(t),dy/dx=(dy/dt)/(dx/dt)=diff(y,t)/diff(x,t)
F(x,y)=0,dy/dx=-Fx/Fy=-diff(F,x)/diff(F,y)
- 定积分与不定积分------int,quad
int函数(不定积分与定积分)和quad函数(定积分的数值计算),int函数是先求出函数的原函数,如果求定积分,再在原函数的基础上按照牛顿——莱布尼茨公式求得定积分的值
int(f) ——计算函数f关于默认变量的不定积分
int(f,x) ——计算函数f关于变量x的不定积分
int(f,x,a,b) ——计算函数f关于变量x从a到b的定积分
函数f不用句柄变量,最好使用符号对象
syms x f=1/(x^2+1)/(x^2+4);
int(f,x,-inf,inf)
quad(f,a,b) ——数值积分,一般用函数文件,f为@函数名
syms x
f=x*sin(x)/(1+cos(x)^2);
int(f,x,0,pi) %ans=int((x*sin(x))/(cos(x)^2 + 1), x, 0, pi) ——说明int求不出了
quad(@fun,0,pi)
%注意函数运算符使用点运算,quad是数值积分,矩阵间运算存在维数问题
第一型曲线积分,先对曲线进行参数化,将曲线积分转化为定积分,再用int函数计算
对曲线进行参数化。
第一型曲面积分,先对曲面进行参数化,将曲面积分转化为二重积分,再转化为二次积分,用int函数计算。
矩形法:利用面积叠加积分。
类似于欧拉,自己分区间
f=@(x)1./(x.^3-2*x-5);
%左矩形法
N=100;
p=linspace(0,2,N+1);
yval=f(p(1:N));
h=p(2)-p(1);
r1=sum(yval*h)
r1 = -0.4528
x=linspace(1,25,100000);
s=sum(abs(sin(x.^2)).*exp(cos(x))*0.00025)
%右矩形法
yval1=f(p(2:N+1));
r2=sum(yval1*h)
r2 = -0.4688
%中矩形法
yval2=f(p(1:N)+h/2);
r4=sum(yval2*h)
%积分
r3=integral(f,0,2)//积分函数,使用句柄函数
r3 = -0.4605
syms t
f1=1./(t.^3-2*t-5);
r4=int(f1,0,2)//int使用的是符号变量----这个求不出来
r4 =
r5=quad(f,0,2)//使用句柄函数。
r5 = -0.4605
%随机点法
yval3=f(p(1:100).*rand(1,100));
r5=sum(yval3*h)
result = sum((f(p(1:N))+f(p(2:N+1)))/2*h)% 梯形法
二重积分
q = integral2(fun,xmin,xmax,ymin,ymax)
ymax = @(x) 1 - x;
q = integral2(@(x,y)x.*y,0,1,0,ymax)//积分区域限制
通过投点计算满足要求的面积
function r=day_12_1_2
N=1e4;
x=-2+4*rand(1,N);
y=-1+4*rand(1,N);
m=sum(x.^2+(y-1).^2<=4);%满足区域一的点数目
n=sum(x.^2+(y-1).^2<=4&y<=abs(3*sin(x)));%满足区域二的点数目
r=n/m*pi*4
index=find(x.^2+(y-1).^2<=4);
x1=x(index);
y1=y(index);
index2=find(y1<=abs(3*sin(x1)));%在区域一的基础上找点。
r1=length(index2)/length(index)*pi*4
ezplot('x*x+(y-1)^2-4'); hold on
ezplot('y-3*abs(sin(x))')
- 级数
symsum(un,n,a,b)其中un为级数通项,n为求和变量,计算数项级数∑un,a,b为累加的范围。若级数收敛,则返回和,发散求得的和为inf或NaN,因此利用该函数可以同时解决求和问题和收敛问题
syms n
u1=(2*n-1)/2^n;
u2=1/n/(2*n+1);
s1=symsum(u1,n,1,inf);
s2=symsum(u2,n,1,inf);
函数的泰勒展开
taylor(f,x,a,‘order’,n)——函数f在a处展开,x是自变量,即展开为(x-a)的幂级数,展开项数为n,即n-1次
taylor(f,x,a)——默认展开6项,即5次幂
taylor(f,x)——默认在0处展开,即麦克劳林展开
taylor(f)
syms x
f=sin(x);
T11=taylor(f,x)
T12=taylor(f,x,'order',20)//限制展开次数需要加’order’。
- 微分方程和微分方程组的解析解
dsolve函数
dsolve(‘方程1’,‘方程2’,…,‘方程n’,‘初始条件1’,…,‘初始条件m,'自变量’),
记号:在表达微分方程时,用字母D表示求导,D2,D3等表示求取高阶导,后面的字母为因变量,自变量可以指定,也可以缺省由系统选定
例如微分方程d 2 y / d x 2 = 0 表示为 D2y=0
y=dsolve('Dy=1/(x+y)','x')
[x,y]=dsolve('Dx+2*x-Dy=10*cos(t)','Dx+Dy+2*y=4*exp(-2*t)','x(0)=2','y(0)=0','t')
- 线性代数应用
直接利用x = A x=Ax=A \ b bb或i n v ( A ) ∗ b inv(A)*binv(A)∗b 得到解
- 线性规划----最优化模型
linprog求解线性规划命令----方程组,求目标函数最小值 -----求最大值要加负号反转。
[x,fval,flag]=linprog(c,A,b,Aeq,beq,Lb,Ub);
lb=<x<=ub;下界和上界------无穷是inf
A.x<=b要转成小于等于
Aeq.x=beq针对等式
x极值点,fval极值,flag=1就是找到了最优解
%先求最小值
c=[-2.5 -5 -10];
a=[-2.5 -5 -10;-2 -2 1];
b=[-50;0];
Aeq=[1,1,1];
beq=100;
Lb=[10;0;20];
Ub=[30;90;80];
[x,fval,flag]=linprog(c,a,b,Aeq,beq,Lb,Ub)-----c,a,Aeq,Lb,Ub的列数往往是一样的,与变量数目一致。
fminbnd:求解单变量---极小值----函数用@句柄
[xmin,ymin]=fminbnd(fun,[x1,x2]),求目标函数fun在x1到x2上的极小点和极小值
%fun = inline('0.5-x*exp(-x^2)');
fun = @(x)0.5-x.*exp(-x.^2);
[xmin, ymin] = fminbnd(fun,0,2)
ezplot(fun, [0, 2])
fminsearch、fminfunc:求解多变量无约束
fminsearch:是求点附近的极小值,所以传入参数是点的坐标,要求传入的参数只有一个
f=@(x)3*x(1).^2+5*x(1)+13*x(2).^2+11*x(2)+4*x(1)*x(2);%函数只定义一个自变量
r=fminsearch(f,[2,6])//x(1)在2附近,x2在6附近。
y=@(x)3*x.^2+6*x+14+8*sin(x);
r=fminsearch(y,4)
fmincon:多变量,有约束----非线性规划
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x0是初始的点,内部实现原则其实是迭代。C(x)代表非线性关系式。
function demo_optim_nonlinear2fmincon
x0=[1;1];
A=[2 3 ;
4 5];
b=[8;
7];
Aeq=[];beq=[];
LB=[0;0]; UB=[];
[x,fval,flag]=fmincon(@fun1,x0,A,b,Aeq,beq,...%三个省略号是换行符。
LB,UB,@consfun)
function f=fun1(x)
f= x(1)^2-x(1)+x(2)^2-2*x(2);
function [c,ceq]=consfun(x)
ceq=[];
t= x(1)^2+x(2)^2;
c=[t-3 % c(1)<=0
-t+1]; % c(2)<=0
intlinprog:混合整数线性规划
ga:困难、复杂、多态
Subs(f,t,ti)对函数里面的变量t用t1替代。
- 拟合
polyfit
p = polyfit(x,y,n),p中的系数按降幂排列,p 的长度为n+1.
x = linspace(0,4*pi,10);
y = sin(x);
%使用 polyfit 将一个 7 次多项式与这些点拟合。
p = polyfit(x,y,7);
%在更精细的网格上计算多项式并绘制结果图。
x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off
语法
- 语句的末尾不使用分号时,系统会显示执行结果。
常用命令、快捷键
clear 清除工作空间中的变量
clear 变量名列表 示例:clear A B 清除变量A, B
clc 清除命令窗口内容
who 列出当前工作空间所有变量名称
whos 列出当前工作空间变量更多信息(维数,占用内存字节数等)
Whos+变量名列表
示例: whos v1 v2 列出变量v1, v2的更多信息
快捷键: 向上方向键、向下方向键
用于浏览命令窗口历史命令、语句
- 数组
1. 使用方括号
l 同一行的元素用“空格或逗号”分隔
l 不同行的元素用“分号或换行”分隔
2.冒号操作符
l 用于创建行向量 a:step:b 其中a:b等同于a:1:b 。step相当于从A到B的步长。
3. linspace(a,b,n) ------等差向量
l n-1等分区间[a, b]的节点组成的行向量(含区间端点a, b)
4. 拼接
l 示例格式1:[A B] 横向拼接要求A,B行数相同,
l 示例格式2:[A; B] 纵向拼接,要求A,B列数相同.
5. 调用函数创建
a = zeros(m, n) 产生一个m行、n列的零矩阵;多用于变量的初始化
a = ones(m, n) 产生一个m行、n列的元素全为1的矩阵
a = eye(m, n) 产生一个m行、n列的单位矩阵
6.提取
获取某一行 A(r, :) 第r行; ------------y1=x([1, 2], :)% 取第1,2行
l 获取某一列 A(:, c) 第c列
l 获取子阵 A(行下标集,列下标集) y2=x([2 3],[1 3 4])% 取第2,3行,第1,3,4列
7.冒号操作
数组名(:) 取数组中所有元素组成列向量
8.修改
赋值即可修改,不过左右维数需要相同
A(i,:)=B(k,:),
9.删除
A(i1:i2, :) = [ ] %删除A由i1:i2指定的行
A(:, j1:j2) = [ ] %删除A由j1:j2指定的列
- End----最后一行或最后一列
x(end,2) = 0; x%将矩阵x的最后一行第2列元素赋值为0
- Rand
rand默认产生(0,1)的随机数
Rand(3,4)是指生成一个三行四列由随机数构成的矩阵
v=150+45*rand(1,100) % 产生150到195之间的随机数 ,在一行,有一百列
想生成某段的随机数需要底数
- 运算符
- 矩阵之间的运算符 + - * / \ ^(执行矩阵乘法)
矩阵转置 B. ' 矩阵共轭转置 B'
l 矩阵加减:A+B,A-B,A与B维数相同或其中之一为标量
l 矩阵相乘:A*B, A与B为矩阵或其中之一为标量
l 矩阵左除:A\B, 当A为方阵表示: A逆乘以B
l 矩阵右除:A/B, 当B为方阵表示 A乘以B逆,或B为标量
l 矩阵幂: A^n, A为方阵
A = rand(3,3); B = rand(3,3);
l C1 = A\B; C2 = A/B
l E1 = C1-inv(A)*B %inv函数求矩阵的逆
l E2 = C2-A*inv(B) %E1,E2 理论上为零矩阵
- 数组对应元素之间 .* ./ .\ .^ (加.之后就是矩阵对应元素进行运算,而不遵循矩阵的运算规律。)
A=rand(3,4);
B=rand(3,4);
A.*B, A./B, A.\B, A.^B
T1=A.*2; %以A的每个元素与2相乘构造数组
T2=A.^2; % 以A的每个元素2次方构造数组
T3=2./A ; % 以A的每个元素的倒数乘以2构造数组
T4=2.\A ; % 以2的倒数乘以A的每个元素构造数组
注意左除和右除,观察谁在上面,谁就是被除数
- 关系运算符
成立返回值1,不成立返回值0;
if a<=3,
disp('a<=3'); //disp这里是输出的意思
end
示例 分析下列语句中数组t1, t2的值
l x =[4 9 1 2 1];
l y =[1 8 5 5 1];
l t1=x>=2
l u=x-y
l t2=x-y>=1
运行输出:
t1 = 1 1 0 1 0 //观察发现,关系运算符会逐一比较数组内的元素并将返回值构成结构相同的数组
u = 3 1 -4 -3 0
t2 = 1 1 0 0 0
- 逻辑运算符
与(and) &
l 或(or) |
l 非(not) ~
- 数据类型
1.主要的数据类型:double 、char、 sym 、struct、 cell
l a=rand(3); %a为double型
l b='Li San';% b为char型
l syms x, y=1 + x^2 %x,y为sym类型;对y赋值的语句含符号对象 ----sym
l F.name='li San', F.birth=1999, F.src=rand(3)%F为struct型
l whos a b x y F //whos+变量名列表
l Name Size Bytes Class Attributes
l F 1x1 620 struct
l a 3x3 72 double
l b 1x6 12 char
l x 1x1 112 sym
l y 1x1 112 sym
- class(变量名)
----返回变量类型,不过 类型以char数组的形式返回,例,’double’
- cell数组基本用法
创建数组用法: a=cell(m,n) //m行n列
存取cell数组用法示例:
a{i} i为下标
a{i,j} i,j分别为行、列下标
特点:一个cell数组中的元素的类型可以互不相同
>> a=cell(2,3);
>> a{1,1}='abc';a{1,2}=rand(3);a{1,3}=cell(1,2)
- 输入输出函数
- input 输入函数
input(提示信息字符数组) 用于输入一般类型数据
- disp 显示数组内容函数
- sprintf 将数组内容格式化为字符串
%d 格式化整数 %f 格式化浮点数
%c 格式化单个字符 %s 格式化字符数组
百分号符号字符后可以加个整数, 用以限定输出化为字符串的长度
s2= sprintf('%10.6f', a)%将a化为10个字符长,含6个小数位的字符串
sprintf括号里面是单引号
- 常用函数
- sum函数
s=sum(v) 求向量v中元素的和
l s=sum(A,1) 或s=sum(A) 求矩阵A中每列的和,返回成1个行向量
l s=sum(A,2) 求矩阵A中每行的和,返回成1个列向量
- 最大值最小值平均值
[v, I]=max(x); [v,I]=max(A,2) 求每行的最大值最大值
l [v, I]=min(x); [v,I]=min(A,2) -----2就是求每行的最小值
l s=mean(v) 求向量v中元素的平均值
l s=mean(A,1) 或s=mean(A) 求矩阵A中每列的平均值,返回成1个行向量
l s=mean(A,2) 求矩阵A中每行的平均值,返回成1个列向量
- length(x)
如果x为向量,则返回x的元素个数;
如果x为矩阵,则返回矩阵x行数和 列数的最大值.
- size(x)
如果x为向量、矩阵,则返回行数、列数组成的行向量。
Size(M,1)返回行数 ,即一竖排元素的个数
- Sort(x)
[B, I]=sort(v) 对向量v中元素排序,B为按递增排序后的元素;I为排序后数组B中 的元素在原数组v中的位置下标.
- Find(x)
index=find(A) 查找函数非零元素位置、元素值
a=[1 5 6 7 4 9];
idx=find(a>=6)
运行输出:
idx =3 4 6
index=find(0.5*exp(x+1)<=y);
- 循环语句
1.if搭配end使用
if name(1)>='a' & name(1)<='h',
disp(['Hello ', name]) % 拼接字符数组
else
disp(['Welcome, ', name]) % 拼接字符数组
end
函数编程
字符串与文本文件操作
引例:
% id='2021150901023';
% filename=[id,'.txt'];%创建了一个名为id的文件
% fid=fopen(filename,'wt');%给打开的文件重命名
% fprintf(fid,'name %s\n','zhangsan');
% fprintf(fid,'birth year %d\n',2001);
% fprintf(fid,'gender %s\n','male');
% fprintf(fid,'id %s\n',id);
% fclose(fid);
% edit(filename)
基本函数
fopen打开文件
fid=fopen('myout.txt','wt')(文件名,打开方式)
fprintf(fid,'name=%s;age=%5d',name,age)
将字符串按照指定格式写入上面指定的文件中
fscanf()从句柄所指定的文件中按照指定格式进行读取
fgets读取一行,保留换行符
fgetl读取一行
% % 打开文件fgetl.m,然后逐行显示
% fid=fopen('fgetl.m','rt');
% while ~feof(fid)%表示没有读到末尾
% tline=fgetl(fid);%只读取一行文本
% disp(tline)
% end
fclose(fid);
fclose关闭
输出结果到文本文件
% fid=fopen('mytext.txt','wt');
% for i=1:10
% fprintf(fid,'LINE%5d %10.6f\n',i,rand);
% end
% fclose(fid);
% edit mytext.txt
实例
fidin=fopen('text.txt','wt');%打开文档
fprintf(fidin,'11111111111 \n zbiddbci \n 222222222 \n dsugd \n33333333\nndsnisod\n44444444444444\n');
fidout=fopen('mkmatlab.txt','w');%创建文档
while ~feof(fidin)%判断到末尾没有
tline=fgetl(fidin);%一行一行的读取
if double(tline(1))>=48&&fouble(tline(1))<=57%判断首字母
fprintf(fidout,'%s\n\n',tline);%doublie(num2str(0))=48
continue%如果不是就进入下一次循环
end
end
索引超出数组元素的数目(0)。
fclose(fidout);
edit mkmatlab.txt
(1) inv——求矩阵的逆;
(2) det—行列式值;
(3) eig——本征值;
(4)diag-对角阵;
(5)'-矩阵转置;
(6) sqrt——开矩阵;
bisection没有看。