MATLAB總結7:常見錯誤歸納
本篇專門用于記錄一些應試技巧
文章目錄
- MATLAB總結7:常見錯誤歸納
- 前言
- 一、一些小定義和小技巧
- 二、蒙塔卡羅求解方法
- 1.函數的定義
- 2.函數引用
- 3.代碼量較少的蒙塔卡羅
- 三、函數引用與多變量
- 四、矩陣引用
- 五、非線性函數:fmincon的使用
- 六、線性規劃函數
- 1.linprog
- 2.fminbnd、fminsearch
- 七、積分和微分
- 1.quad積分
- 2.積分int 微分diff
- 八、lsqcurvefit
- 九、矩陣求解
- 十、polyfit 函數進行多項式擬合
- 十一、ode23和ode45
- 十二、fzero
- 十三、meshgrid和surf
- 十四、fsolve
前言
記憶力比較差,把學習過程中常用的語法記錄于此,方便回憶時索引
一、一些小定義和小技巧
- rand的使用
rand 是用于生成在(0,1)上隨機數的函數,而后面加入 rand(1,2),則意為一個一行兩列的(0,1)矩陣,不可亂加。需要使用不同范圍的隨機數則使用 A*rand() 即可
x=5*rand();y=5*rand();
- 符號
取余:mod(A,b)%A是要進行取余的數字,b是除數
不等于:~=
-
find()的使用
用r=find(A<=0.6),直接找到A中小于0.6的下標 -
分段函數的使用
y=(x<=8).* (2*x)+(x>8&&x<12).*(3*x)+(x>12).* (4*x);
- upper, lower的大小寫轉換
for i=1:length(v)if v(i)=='a'r(i)=upper(r(i));elseif v(i)=='h'r(i)='2';elseif v(i)=='v'r(i)='3';end
end
二、蒙塔卡羅求解方法
1.函數的定義
代碼如下(示例):
function c=myobj(x)
c=10*x(1)^3+x(3)*(x(1)^2+x(2)^2);
function r=mycon(x)
r=[x(1)^2+x(2)^2-x(3)-10 ; x(1)^2+x(2)^2+x(3)-3];
function m=myrand
while 1m=[10*rand-5 ;10*rand-5 ;10*rand-5 ];if mycon(m)<=0return end
end
2.函數引用
代碼如下(示例):
function [val,x]=myfun2
rand('seed',11);betterx=myrand;
betterval=myobj(betterx);for i=1:10000betterx=myrand;if myobj(betterx)>betterval;betterval=myobj(betterx);end
end
x=double(betterx);
val=double(betterval);
3.代碼量較少的蒙塔卡羅
function [val,x]=myfun2
rand('seed',11);
val=0;
for i=1:100000s=-10*rand(1,3)+5;if s(1)^2+s(2)^2-s(3)-10<=0 && s(1)^2+s(2)^2+s(3)-3<=0if 10*s(1)^3+s(3)*(s(1)^2+s(2)^2)>valval=10*s(1)^3+s(3)*(s(1)^2+s(2)^2);x=s;endend
end
三、函數引用與多變量
要分清多元函數的變量要用循環引用
代碼如下(示例):
function v=testmain
x=-2:0.1:2;
v=fun(x);function r=fun(x)
for i=1:length(x)if x(i)<-1r(i)=x(i)^2+2*x(i)+1;elseif x(i)>-1 && x(i)<=2r(i)=3*x(i);elser(i)=2*sqrt(x(i));end
end
四、矩陣引用
引用矩陣可以用行列索引,也可以單行單列(注意單行單列是逗號),而且引用矩陣必須是括號
代碼如下(示例):
A(1,:)%引用第一行
A(:,2)%引用第二列
A(1,:)=A(1,:).^2;%給矩陣賦值要明白給誰賦值
五、非線性函數:fmincon的使用
- 使用時要注意哪里是只輸入系數,哪里是方程
- 求最小值的是方程,其他的都只輸出系數
- 同種變量用逗號隔開,不同種用分號
- 注意noncon的位置是使用@,引用里面有()
- lb ub里面是逗號
- 函數系數的對應關系
代碼如下(示例):
function [min,val]=fun3
Fun=@(x) 2*(x(1)-1)^2+3*(x(2)-1)^2+0.2*x(1)*x(2)+(2*x(3)-2)^2
A=[3 2 6;4 5 2;2 9 7];
b=[50;40;100];
Lb=[0,0,0];
ub=[15,9,25];
[min,val]=fmincon(Fun,[0,0,0],A,b,[],[],Lb,ub,@noncon);
function [c,ceq]=noncon(x)
c=[-2*x(1)^-x(2)^2-x(3)^2+5,x(1)^2+x(2)^2+2*x(3)^2-200];
ceq=[0];
六、線性規劃函數
1.linprog
求解常規線性規劃
注意!!!f 函數調用是系數
代碼如下(示例):
function [x,fval]=myfun19
f=[3,-4,2];
A=[1 -1 1;3 2 4;3 2 0];
b=[10;22;10];
Aeq=[];
beq=[];
lb=[0,0,0];
ub=[inf,inf,inf];
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub);
2.fminbnd、fminsearch
用于找到極小值,fminbnd找到區間內,fminsearch找到從某一點開始的極小值
fminbnd
[x,val] = fminbnd(fun, x1, x2)
% 定義要最小化的函數
fun = @(x) x^2 + 2*x + 1;% 在區間[-2, 2]內尋找最小值
[x,val] = fminbnd(fun, -2, 2);
fminsearch
% 定義要最小化的函數
fun = @(x) x(1)^2 + x(2)^2;% 指定初始點
x0 = [1, 1];% 在多維空間中尋找最小值
x = fminsearch(fun, x0);
七、積分和微分
1.quad積分
y=@(x) (3.*x+2)./(x.^3+2.*x+5);
r=quad(y,0,3);
2.積分int 微分diff
F=@(x,y) exp(2*x.^2+3*y.^2);
I=integral2(F,0.5,1,0,1);%取值范圍
八、lsqcurvefit
- xdata,ydata儲存數據,x(i)存放未知變量
- 調用時要把 fun(x,xdata) 全部帶上
- 注意調用時,x和x1的意義是已經計算的系數和要代入計算的函數值,他們的位置和使用fun時的位置相對應!!!
代碼如下(示例):
xdata=[10.03,20.04,30.23,40.37,50.16,60.4,70.3,80.66,90.69,100.16,110.94,121.18,130.66,141.23,150.88,160.24];
ydata=[50.44,82.95,133.07,202.76,286.39,381.34,467.36,540.54,591.7,624.28,647.62,660.77,668.06,672.83,675.36,676.82];
fun = @(x,xdata) x(1)./(1+((x(1)/x(2))-1).*exp(-x(3)*xdata));
x0 = [1,1,1];
x = lsqcurvefit(fun,x0,xdata,ydata);
x1=[150:0.5:190];
y=fun(x,x1);
九、矩陣求解
- 可以使用linsolve
- 也可以求逆
- 或者是符號“\”
代碼如下(示例):
a=[1 1 -1 2;-1 -2 1 -3;1 1 1 -3;2 1 -3 1];
e=[-3;1;-7;4];
x=inv(a)*e;
a=[1 1 -1 2;-1 -2 1 -3;1 1 1 -3;2 1 -3 1];
e=[-3;1;-7;4];
x=linsolve(a,e);
a=[1 1 -1 2;-1 -2 1 -3;1 1 1 -3;2 1 -3 1];
e=[-3;1;-7;4];
x=a\e;
十、polyfit 函數進行多項式擬合
- p = polyfit(x, y, n);
- x 是數據點的 x 值(自變量)向量,y 是數據點的 y 值(因變量)向量,n 是要擬合的多項式的次數。
- polyval(p,50); 用于計算特定位置的值
代碼如下(示例):
% 示例數據點
t=[1,6,11,16,21,26,31,36];
x=[5.35,10.51,15.664,20.76,25.94,30.08,35.22,40.36];
p=polyfit(t,x,1);
val=polyval(p,50);
r=[p,val];
十一、ode23和ode45
- 使用myode時,注意輸入要把x,y都帶上,先是自變量,后是因變量
- y(1)可表示y,y(2)可表示一階導數
- 輸出 [t,y] 分別是對應時間點和對應時間的輸出值
y1 = 0:0.01:1;%取值范圍
y0 = 1;初值
[t,y] = ode23(@myode, y1, y0);function dydx=myode(x,y)dydx=(2/3)*x/y^2;
function r = myfunx1 = 0:0.1:100;%定義范圍x0 = [2; 0]; %定義初始條件[t, x] = ode23(@myode, x1, x0);%這里的x是一個向量
endfunction dxdt = myode(t, x)dxdt = [20*(1-x(1)^2)*x(2) + 0.5*x(1); 0];%x(1)代表x,x(2)代表dx/dt
end
十二、fzero
x0 是初始猜測的根的值。
代碼如下(示例):
x = fzero(fun, x0)
x = fzero(fun, x0, options)
十三、meshgrid和surf
- 注意z的輸出
- [x,y]=meshgrid(x取值,y取值)
- surf繪制表面圖
代碼如下(示例):
function z=myfun24
[x,y]=meshgrid(-3:0.1:3,-3:0.1:3);
z=x.*y.*exp(sin(x.^2+y.^2));
surf(x,y,z);
十四、fsolve
- 記住兩個公式:root2和fsolve的使用
- folsve(@root2,x0)
- f=root2(x) f(1)= f(2)=
代碼如下(示例):
% 示例數據點
function r=myfun29
x0=[0,0];
r=fsolve(@root2,x0);function f=root2(x)
f(1)=x(1)^2-x(2)-1;
f(2)=(x(1)-2)^2+(x(2)-0.5)^2-1;