注意使用矩阵乘法和标量乘法
n=sum(x.^2+y.^2<=1);
m=sum(x.^2+y.^2<=1&y-abs(x)>=-1);
r=m/n*pi;
穷举更新最小值
function [val,x]=mengtekalieluo_qimo
rand('seed',1523);
N=1e7;
x1=1+1*rand(1,N);
x2=-2+4*rand(1,N);
val=(1+x1(1)).^3+x2(1);
x=1;
for i=1:N
if(val>(1+x1(i))^3+x2(i))
val=(1+x1(i))^3+x2(i);
x=[x1(i)
x2(i)];
end
End//求最大值和所对应的点---只求一个位置。
function test_optim_practnonlinear3
% % 练习题3的MC法
% oldval = -inf;%局部变量,初始化为足够小的数
% s = 1;
% for i=1:1e5 %循环次数足够大
% 均匀投点
% x1 = unifrnd(0,20);%unifrnd(a,b,m,n)产生均匀随机数
% x2 = unifrnd(0,20);
% x3 = unifrnd(0,20);
% x=[x1 x2 x3];
% val = fun(x);
% if val > oldval & mycons(x)<=0 %比以前的函数值更大
% oldval = val;
% oldx = x;%保存/更新
% end
% end
% oldval
% oldx %近似最优解
% function c = mycons(x)
% c=[10-(2*x(1)+5*x(2)+10*x(3))
% 5*x(1)+x(2)+20*x(3)-300
% 10*x(1)^2+4*x(2)+3*x(3)^2-600];
% function r = fun(x)
% r=20*(x(1)-1)^2+50*x(2)+40*x(3);
使用find找到符合要求的组,再用min,max
%因为是生成的同样大小的三行随机数,所以用index找到满足条件的组合即可。
N=1e6;
x1=15*rand(1,N);
x2=9*rand(1,N);
x3=fix(25*rand(1,N));
index=find(3*x1+2*x2+6*x3<=20&4*x1+5*x2+2*x3<=21);
x=x1(index);
y=x2(index);
z=x3(index);
minf=min(2*(x-1).^2+3*(y-4).^2+x.*y+(2*z-5).^2)
N=1e6;
x1 = unifrnd(0,20,1,N);
x2 = unifrnd(0,20,1,N);
x3 = unifrnd(0,20,1,N);
index=find(10-(2*x1+5*x2+10*x3)<=0&5*x1+x2+20*x3-300<=0&10*x1.^2+4*x2+3*x3.^2-600<=0);
x=x1(index);
y=x2(index);
z=x3(index);
[mmaxf,m]=max(20*(x-1).^2+50*y+40*z)
%m为最大值处的索引。
x(m)
y(m)
z(m)
param=lsqcurvefit(fun, param0, xdata, ydata)。
function f=curvefun1(coef,xdata)
f = coef(1)+coef(2)*exp(-0.02*coef(3)*xdata)% 其中coef(1)=a,coef(2)=b,coef(3)=k
xdata = 100:100:1000;
ydata = 1e-03*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];
x0 = [2.3,9.09,0.05];//coef的初始迭代值
x = lsqcurvefit('curvefun1',x0,xdata,ydata)
f=curvefun1(x,xdata)
plot(xdata,ydata,'rp',xdata,f)
可以计算出x =0.0070 -0.0030 0.1032-----------系数
求概率:
1.用Y的概率模拟分布生成Y,再用满足条件的数目除以总数。
N=1e4;
x=normrnd(20,2,1,N);
y=rand(1,N)
for i=1:N
if y(i)<0.2
Y1(i)=8;
elseif y(i)<0.5
Y1(i)=9;
elseif y(i)<0.9
Y1(i)=10;
else
Y1(i)=11;
End//根据概率生成N个随机数Y。
end
index=find(x+Y1<=30)
r=length(index)/N
2.只用X的分布,Y只用它的概率参与计算。
N=1e4;
x=normrnd(20,2,1,N);
t1=sum(x<=22);
t2=sum(x<=21);
t3=sum(x<=20);
t4=sum(x<=19);
r=0.2*t1/N+0.3*t2/N+0.4*t3/N+0.1*t4/N;
同求概率
创建数组------cell, sparse
M=cell(m,n)
创建 m 行 n 列的元胞数组 M.
S=sparse(A)
返回 A 的稀疏存储格式矩阵 S。通过挤出任何零元素将满矩阵转换为稀疏格式。如果矩阵包含许多零,将矩阵转换为稀疏存储空间可以节省内存。
ANY或ALL可以将矢量转为标量。
ezplot('x/exp(1)',[0 C 0 1])
linspace产生等差数列,(x1,x2,n),产生x1到x2之间n个
统计-----
Mean-----A 沿大小不等于 1 的第一个数组维度的元素的均值。
Std-----求标准差, A 沿大小不等于 1 的第一个数组维度的元素的标准差
Var------返回 A 中沿大小不等于 1 的第一个数组维度的元素的方差。
sort(a,'descend')----降序排序
sort(a,'ascend')-----升序排序
数学函数:
log---对应ln(x),
Log10对应log10(x),
conj---返回 Z 中每个元素的复共轭,
Mod---除后的余数(取模运算)
Rem----返回用a除以b后的余数,rem(a,b)
Real-----返回数组 Z 中每个元素的实部。
Imag------返回数组 Z 中每个元素的虚部。
Power----计算 A 中每个元素在 B 中对应指数的幂。A.^B===power(A,B)
pow2-----求以 2 为底的幂值并对浮点数字进行缩放.返回数组 X,其元素为 2 的 Y 次幂。
asin, acos, atan, acot----三角反函数
控制语句-----warning
符号
符号表达式-------pretty
simplify(A)----用来化简的函数---需要是符号变量。
符号计算------diff, limit, int, solve, dsolve,subs,taylor---使用符号变量
Limit(f,x,a,’left/right’)---在a处求极限。
Diff(f,x,n)-----求导n次
表达式化简函数simplify。
vpa(s) 计算符号表达式s的数值结果
Solve解线性方程组。--------不能用字符串的形式。
syms u v a b;
eqns=[2*u+a*v==0,b*u-v==1]-----使用等式,多个等式用数组的形式。
eqns =
s=solve(eqns,[u,v]);----表明待求的变量是什么
s.u%要去读取
ans =
dsolve解微分方程。
字符表示:
Dy”表示对y的1阶导数,“D2y”表示对y的2阶导数
y=dsolve('Dy=(10-0.02*t)*t','y(0)=4','t')%默认---标明谁是自变量
如果不用字符的形式,方程的等号用双等号==
syms y(x)
y=dsolve(diff(y)==(50-0.01*y)*y,y(0)==4,x)
的根。 x = fzero(fun,x0)。不变号没法求。
矩阵
矩阵操作:
Diag:diag - 创建对角矩阵或获取矩阵的对角元素,返回包含主对角线上向量 v 的元素的对角矩阵。
Tril-----返回矩阵 A 的下三角部分。
Triu-----返回矩阵 A 的上三角部分。
解线性方程组 Ax=b,方法:inv(A)*b, A\b
特征值、特征向量----------eig 用法: [V,D]=eig(A), d=eig(A)
矩阵的逆、行列式、秩-----inv, det, rank
删除矩阵的第三四列:
A(:,1)=[];//通过[]来删除元素
A(:,3)=[];%第一列删了,第四列就是第三列了
A=[u,v;
w,u];//维数满足要求矩阵直接拼接。
MA=M(3:9,:);//第三到九行
arr=[arr i];往数组里面增加元素。
数组变列向量A(:)
非线性方程(组)求根
---roots,fzero, fsolve,牛顿迭代法(切线法)
牛顿迭代法:迭代公式x=x0-f(x0)/df(x0)
f=@(x)(x-3)^2;%这样定义的函数可以直接带值进去
df=@(x)2*(x-3);
maxitr=500;
x0=1;%x0初始迭代点
tol=1e-6;%误差
for i=1:maxitr
x=x0-f(x0)/df(x0);%迭代
if(abs(x-x0)<tol)
itr=i;%实际迭代次数
break;
end
x0=x;%更新x的值。
end
x,itr
Roots:以列向量的形式返回 p 表示的多项式的根。输入 p 是一个包含 n+1 多项式系数的向量,以 xn 系数开头。0系数表示方程中不存在的中间幂。例如:p = [3 2 -2] 代表多项式 3x2+2x−2。
r = roots(p)
%求方程的根:f(x)=2*x^3-4*x^2+x-100=0
a1 = roots([2 -4 1 -100]);roots(p)---p为各阶系数
Fsolve: x = fsolve(fun,x0)
Fzero:尝试求出 fun(x) = 0 的点 x。也需要x0,此解是 fun(x) 变号的位置 - fzero 无法求函数(例如 x^2)的根。
x = fzero(fun,x0)。不变号没法求。
f = @(x)2*x.^3-4*x.^2+x-100;
[x,val]=fzero(f,1) % 在x=1附近找求f(x)的零点
[x2,val2]=fsolve(f,1)%解方程f(x)=0
feval(fun,x1,...,xM) 使用函数的名称或其句柄以及输入参数 x1,...,xM来计算函数的结果。就相当于fun(x1,……,xM)
fsolve解方程组
r=fsolve(@myobj,[1 1]);
function f=myobj(x)
f(1)=x(1).^2+x(2).^2-1
f(2)=(x(1)-1).^2+x(2).^2-1
fsolve(@myobj,[1,1])//
function f=myobj(x)//只能使用一个变量。将xy写为x(1),x(2)
f(1)=x(1).^2+x(2).^2-20;
f(2)=(x(1)-2)*x(2)+6*x(1)+x(2);
拟合
曲线拟合 ---------p=polyfit(xd,yd,n), y=polyval(p,x)
积分
数值积分 ---
矩形法(左矩形法,右矩形法,中矩形法(中间点的函数值))
trapz - 梯形数值积分,梯形法(上底加下底乘以高除以2)
通过梯形法计算 Y 的近似积分(采用单位间距)
使用函数句柄
Quad---q = quad(fun,a,b)
Dblquad-----q = dblquad(fun,xmin,xmax,ymin,ymax)
Integral----- q = integral(fun,xmin,xmax)
integral2------ q = integral2(fun,xmin,xmax,ymin,ymax)
而int需要符号变量。输出结果相当于int积分后再vpa()。
quad是对句柄函数积分!!!!
注意乘除都要加点变成标量运算。
欧拉法常微分方程y¢ = f (t, y), y(a) = b. ---实质是求积分
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')
常微分方程:ode23, ode45
[t,y] = ode23(odefun,tspan,y0), y'=f(t,y) 从 t0 到 tf 的积分,初始条件为 y0
% 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;
极值
一元函数极值 ----fminbnd----只能找最小值,而且需要区间范围。通常先用ezplot画图找区间。所以如果是求最大值可以在前面加一个负号。
ezplot(f,[0,9])%找出区间大概在[7,9]
ezplot(fun,[xmin,xmax])
ezplot(fun2,[xmin,xmax,ymin,ymax])
[x,y]=fminbnd(f,7,9);---------fminbnd(f,xmin,xmax)
多元函数极值 -----fminsearch(使用无导数法计算)fminsearch是在点附近迭代,所以需要输入一个初始的点。y=fminsearch(f,[x(1),x(2)]);x = fminsearch(fun,x0);---变量都用单个x
解线性规划 -----将最优化问题转为线性规划模型, 求解函数 linprog
[x,val,flag]=linprog(c,A,b,[],[],lb,ub)
解非线性规划 -----将最优化问题转为非线性规划, 求解函数 fmincon
nonlcon = @circlecon;
x = fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon)-----x0初始迭代点
function [c,ceq] = circlecon(x)
c = 2*x(1).^2 + 4*x(2)^2 - 1000;
ceq = [];
随机数
rand,rand(m),rand(m,n) 产生(0,1)区间均匀分布
unifrnd(a,b),unifrnd(a,b,m),unifrnd(a,b,m,n)产生区间[a,b]上均匀分
布随机数
a=randn; A=randn(m);A=randn(m,n); 产生标准正态分布随机数用法
a=normrnd(mu,sigma),A=normrnd(mu,sigma,m),
A=normrnd(mu,sigma,m,n) 产生一般正态分布随机数
利用几何概率建立模型,设计实现求解一些问题
直方图---------hist, histogram
cell,sparse,fprintf,warning,tril,triu,dblquad,intergral,integral2
fsolve,fminsearch,fmincon,unifrnd,normrnd.
如果 A 是矩阵,则 cumsum(A) 返回包含 A 每列的累积和的矩阵
s=unifrnd(0,5,1,100)
for i=1:100
U=cumsum(s(1:i));//逐个累加的效果。U的格式是矩阵,1*100.
end
plot(1:100,U,'.')
需要N组x(1),x(2),x(3)时,可以直接rand分配(N,3),这样每行,x(i,:)都是包含三个数字的。
sum的输出是向量、矩阵。
对于有多个维度的“矩阵”,比如m*n*l*s这样的,sum输出只是比输入少一个维度,变成n*l*s的.
所以当我们的计算是n*n的矩阵时,要求和,需要使用两次sum。
复合计算函数
compose(f, g) 返回复合函数f(g(y)),其中f=f(x),g=g(y).
s=solve([a*x+b*y==10,a*x-b*y==20],[x,y]);
solve([eqn],[x])
semilogy - 半对数图,此MATLAB 函数使用 y 轴的以 10 为基数的对数刻度和 x 轴的线性刻度创建一个绘图。它绘制 Y 的列对其索引的图。
interp1 - 一维数据插值(表查找),向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标。
vq = interp1(x,v,xq)-----通过已知的点来预测未知的点的值是多少。
Fuhao.mlx
Lin.mlx-----难
mengtekalieluo
分段函数,求不同的x(i)对应不同的val(i)
save svl.mat a b t
clear
whos
load svl.mat
常用函数:min,max,sum,mean-----均值,std----标准差,var----反差
find查找
strfind找字符
hist - 直方图
找拐点——近似二阶求导。