a=[1, 1]; % 數(shù)值解 for i=3:100,a(i)=a(i-1)+a(i-1); end a a=sym([1, 1]); % 解析解 for i=3:100,a(i)=a(i-1)+a(i-1); end a 啊這,,為什么我用不了了 C:\Program Files\MATLAB\R2018b\toolbox\maple 發(fā)現(xiàn)是這個(gè)文件夾 https://www.voidtools.com/zh-cn/ 下載安裝everthing,,做文件搜索 我替換了一下 dll問價(jià) 報(bào)錯(cuò)誤,,新的 https://www.mathworks.com/matlabcentral/answers/489410-sym-x-returns-error-symbolic-math-toolbox-is-installed 這里說了,,就是裝maple的鍋,,估計(jì)是32位的Maple替換了原本64位matlab自帶的maple庫,,我還能遇到這種事情,?,?,? 確實(shí)是安裝的時(shí)候在問路徑在哪里 這個(gè)符號(hào)工具箱,,2018b沒有 你說,這樣的操作 確實(shí)很狗 pathtool工具,,集成了所有的搜索文件 我們這里移除maple的工具箱 看看目錄 復(fù)制進(jìn)去 其實(shí)我覺得,,只要找一個(gè)相同版本的替換一下工具箱就行 插入一個(gè)語法、 知乎看見這個(gè)了,,也就是說 以后的版本,,函數(shù)還是會(huì)變化 https://www.mathworks.com/products/symbolic.html 這里推薦了這個(gè),好厲害的樣子 買不起 真麻煩,,我的符號(hào)計(jì)算死翹翹了 關(guān)于MATLAB的問題請(qǐng)來這里搜索 lookfor模糊搜索 這個(gè)里普諾夫方程,,好像是自動(dòng)化使用的多 https://www.mathworks.com/help/releases/R2018b/control/linear-algebra-for-control-design.html 具體的這些矩陣方程的求解 推薦課程 https://ww2.mathworks.cn/support/search.html/videos/matlab-for-teaching-82560.html?fq[]=asset_type_name:video&fq[]=category:symbolic/index&page=1 一些內(nèi)置的小符號(hào) 還是符號(hào) 以及一些別的變量的嘗試 maple也內(nèi)置了vps函數(shù) 數(shù)值計(jì)算里面的大佬 簡(jiǎn)單生成矩陣 矩陣的維數(shù),可以動(dòng)態(tài)變化 就是括號(hào)不好匹配 [返回的值]=function_name(參數(shù)列表) 好好記住這個(gè)函數(shù)的調(diào)用寫法 [U S V]=svd(X) 對(duì)X矩陣就行奇異值分解,,返回USV三個(gè)變量,。 冒號(hào)表達(dá)式:函數(shù)的原型是 v=s1:s2:s3 該函數(shù)生成一個(gè)行向量(就是橫著的),s1是起始值,,s2是步距(就是一次走的最小的值),,s3當(dāng)然就是結(jié)尾了。 小試牛刀 你可以花里胡哨的自己任意發(fā)揮 v2向量為1 x 0的空矩陣 v3很好的展示了默認(rèn)步長(zhǎng)為1這個(gè)現(xiàn)象 v4則是降序的排列 提取一塊: B=A(v1,v2) 很多時(shí)候我們是不要一個(gè)大矩陣的,,所以就提取,,其實(shí)就是Python里面的切片法,。 v1表示保留行號(hào)構(gòu)成的向量 v2表示保留列號(hào)構(gòu)成的向量 先搞個(gè)矩陣 分析一下,這個(gè)B1其實(shí)使用了兩個(gè)函數(shù),,分塊+向量生成,。 提取A的全部奇數(shù)行,所有列 提取A的3,,2,,1行 反復(fù)三次由首列構(gòu)成的子矩陣 A矩陣左右翻轉(zhuǎn) 永遠(yuǎn)記住,分號(hào)就是換行 要執(zhí)行逐元素乘法而不是矩陣乘法,,請(qǐng)使用.*運(yùn)算符 可以很明顯的看出來是,,對(duì)應(yīng)的位置元素相乘然后生成的 這樣是矩陣乘法 串聯(lián),拼接什么的 我覺得名字都合適 英文是concatenation 逗號(hào)是水平連接 懂就行 分號(hào)是換行?。,。∫簿褪窃赱 ]的規(guī)約下 前提行一樣,,就是長(zhǎng)度一樣,,這樣摞起來一樣的長(zhǎng) 列數(shù)一樣的時(shí)候,分號(hào)也是可以連接的 其實(shí)這些上面都是設(shè)計(jì)的事情,,別那么快想學(xué)會(huì),,慢下來想一下,為什么,。你五分鐘搞懂一個(gè)概念,比你什么時(shí)候都模棱兩可的強(qiáng),。一定要體會(huì)哪種為什么這么做的感覺,。 看出來沒有 A(行(橫),列(shu)) 不常見的用法,,蛇形排列 這個(gè)的名詞解釋叫線性索引 線性就是一個(gè)的意思 但是,,在賦值語句的左側(cè),您可以指定當(dāng)前維度之外的元素,。陣列的大小增加以容納新來者,。 你看解釋 冒號(hào)單獨(dú)指定了該維度中的所有元素 這中間好多知識(shí),寫的好麻煩 字丑,,自己看啊 norm函數(shù),,Excel說了 matlab里面是計(jì)算范數(shù)的 一個(gè)矩陣的三次方根應(yīng)該有三個(gè)結(jié)果 上面計(jì)算出一個(gè) 下面旋轉(zhuǎn)兩次得到另外兩個(gè) find函數(shù)好哇,可以把滿足關(guān)系的函數(shù)的數(shù)組下標(biāo)打印出來 為了好看,,轉(zhuǎn)置一下 這個(gè)函數(shù)就是先把矩陣搞成一列,,讓你哈偶判斷,接著把合適的下標(biāo)輸出,、 嵌套把A中NaN的量輸出 可以直接把行列坐標(biāo)打印出來 轉(zhuǎn)置一下 然后,,下面報(bào)錯(cuò) 第一個(gè)表示,,A矩陣中的某列元素大于等于5,變1,,否則0 我糊涂了,這里 想判定一個(gè)A元素都大于或等于5 Matlab在符號(hào)計(jì)算上面依賴于Maple的SDK s1=0; for i=1:100,s1=s1+i; end s1 for循環(huán)時(shí)最強(qiáng)大的循環(huán),可以一直使用 s2=0; i=1; while(i<=100) s2=s2+i i=i+1 end s2 while是適合逼近一些條件的時(shí)候去收斂,,比如求一個(gè)最小的m值 內(nèi)置的計(jì)算結(jié)果
s=0; m=0; while(s<=10000) m=m+1; s=s+m; end,s,m matlab的矩陣化計(jì)算,,久負(fù)盛名,所以就看看矩陣化計(jì)算的好處,。 tic,s=0; for i=1:100000 s=s+1/2^i+1/3^i; end toc tic,i=1:100000; s=sum(1./2.^i+1./3.^i) toc 下面是矩陣運(yùn)算化的結(jié)果 function [m,s]=findsum(k) s=0; m=0; while (s<=k) m=m+1; s=s+m; end 函數(shù)的編寫和調(diào)用 一個(gè)好習(xí)慣,,函數(shù)名字就是m文件的名字 function A=myhilb(n,m)
if nargout>1,error('太多的輸出參數(shù)'); end
if nargout==1,m=n; elseif nargin==0|nargin>2,error('輸入了錯(cuò)誤的參數(shù)'); end
for i=1:n for j=1:m A(i,j)=1/(i+j-1); end end
以上是自己寫的哈密頓矩陣生成函數(shù) 這個(gè)地方,,測(cè)試輸入的參數(shù)個(gè)數(shù) 其實(shí)生成的算法很簡(jiǎn)單,,兩個(gè)循環(huán)就完事了 function k=my_fact(n) if nargin~=1 error('僅接收一個(gè)輸入的參數(shù)') end
if abs(n-floor(n))>eps|n<0 error('n要輸入一個(gè)非負(fù)的數(shù)'); end
if n>1 k=n*my_fact(n-1) elseif any ([0 1]==n) k=1; end 一個(gè)階乘的計(jì)算程序 可變輸入輸出個(gè)數(shù)的處理,多項(xiàng)式相乘的函數(shù),,conv,,那連乘呢? function a=convs(varargin) a=1 for i=1:length(varargin) a=conv(a,varargin{i}); end 這時(shí)所有的輸入變量列表由單元變量varargin表示,。返回時(shí)可以用varargout來表示,。 最出名的函數(shù)句柄 https://ww2.mathworks.cn/help/matlab/matlab_prog/creating-a-function-handle.html 函數(shù)句柄可用于間接調(diào)用函數(shù)的變量 函數(shù)句柄是一種表示函數(shù)的 MATLAB? 數(shù)據(jù)類型。函數(shù)句柄的典型用法是將一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),。例如,,你可以將函數(shù)句柄用作基于某個(gè)值范圍計(jì)算數(shù)學(xué)表達(dá)式的函數(shù)的輸入?yún)?shù)。 函數(shù)句柄可以表示命名函數(shù)或匿名函數(shù),。要?jiǎng)?chuàng)建函數(shù)句柄,,請(qǐng)使用 f = @(x,y) (x.^2 - y.^2); 什么是函數(shù)句柄,?函數(shù)句柄是一種存儲(chǔ)指向函數(shù)的關(guān)聯(lián)關(guān)系的 MATLAB? 數(shù)據(jù)類型。間接調(diào)用函數(shù)使您在調(diào)用該函數(shù)時(shí)無需考慮調(diào)用位置,。函數(shù)句柄的典型用法包括:
首先明確一點(diǎn),函數(shù)句柄是matlab里面一種數(shù)據(jù)類型 代碼 放大感覺我注意的溝溝彎彎的地方?jīng)]有很明顯 x=[-pi:0.05:-1.8,-1.799:.001:-1.2,-1.2:0.05:1.2,...]; 1.201:0.001:1.8,1.81:0.05:pi]; >> plot(x,y) 注意新名詞,,變步距 是不是效果顯著 我手邊有個(gè)這函數(shù) y=1.1*sign(x).*(abs(x)>1.1)+x.*(abs(x)<=1.1); 用關(guān)系表達(dá)式繪制的圖形,,當(dāng)然了,,分段線性的非線性曲線可以由幾個(gè)有限的轉(zhuǎn)折點(diǎn)繪制。 極坐標(biāo)下繪圖 theta就是就是角度 rho就是密度一樣的哪個(gè)羅馬字母 >> theta=0:0.01:6*pi; >> rho=5*sin(4*theta/3); >> polar(theta,rho) 為了方便復(fù)制,,這里把代碼附上 結(jié)果 >> t=0:.2:2*pi; >> y=sin(t);
>> subplot(2,2,1),stairs(t,y); >> subplot(2,2,2),stem(t,y) >> subplot(2,2,3),bar(t,y) >> subplot(2,2,4),semilogx(t,y) 注意這里用了子圖函數(shù) 第一個(gè)2是,,窗口分為兩行 第二個(gè)2是,窗口分為倆列 第三個(gè)數(shù)是,,確定位置 成果 階梯曲線 火柴桿曲線 直方圖 橫坐標(biāo)為對(duì)數(shù) 一些函數(shù)叫隱函數(shù),,就是沒有辦法給解析式 plot()繪制不了 使用ezplot(),定義域機(jī)器自己給 也可以自己給定義域 >> ezplot('x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)') >> ezplot('x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)',[-10 10]) 注意一開始的小符號(hào),,就是L鍵旁邊的旁邊的按鍵 我太貼心了 然后也支持LaTeX的語法 就記住_^分別是下標(biāo)和上標(biāo) a_2^2+b_2^2=c_2^2 就像這樣,。 現(xiàn)在開始整點(diǎn)立體的,那肯定就是參數(shù)方程了,,肯定跑不了的我和你說,。 >> t=0:.1:2*pi; >> x=t.^3.*sin(3*t).*exp(-t); >> y=t.^3.*cos(3*t).*exp(-t); >> z=t.^2; >> plot3(x,y,z) 寫公式真是一個(gè)好累的工作,注意這里是.^全部是單乘 結(jié)果好看就行 stem3(x,y,z);hold on;plot3(x,y,z),grid 可以使用stem3繪制火柴桿曲線 接下來在認(rèn)識(shí)一下三維曲面的繪制,,一般是二元函數(shù)才能繪制這樣的圖像,。就像: z=f(x,y) 一個(gè)三維的曲面圖,不是一下就可以繪制出來的,。需要先生成網(wǎng)格矩陣數(shù)據(jù)x和y,。然后才可以使用點(diǎn)運(yùn)算生成Z矩陣。 [X ,Y]=meshgrid(v1,v2) 這就是第一步的工作,。里面v1,,v2為x,y軸的分隔方式,。 >> [x,y]=meshgrid(-3:0.1:3,-2:0.1:2); >> z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); >> mesh(x,y,z) >> 你仔細(xì)讀這個(gè)函數(shù),,meshgrid,后面是不是給了倆段的分段 >> surf(x,y,z) >> mesh(x,y,z) >> waterfall(x,y,z) 三種函數(shù)的繪制方式 [x,y]=meshgrid(-2:.1:2); z=1./(sqrt((1-x).^2+y.^2))+1./(sqrt((1+x).^2+y.^2)); surf(x,y,z) shading flat 再繪制一個(gè),,但是仔細(xì)看這個(gè)圖有毛病 這都無窮值了 xx=[-2:.1:-1.2,-1.1:0.02:-0.9,-0.8:0.1:0.8,0.9:0.02:1.1,1.2:0.1:2]; yy=[-1:0.1:-0.2,-0.1:0.02:0.1,0.2:0.02:.1:1];
[xx,yy]=meshgrid(xx,yy); z=1./(sqrt((1-x).^2+y.^2))+1./(sqrt((1+x).^2+y.^2)); surf(x,y,z) shading flat zlim([0,15]) 變步距繪制一下,,再到(+-1,,0)處 所以再這個(gè)區(qū)域就變步距,,這里Z軸范圍還是一樣 其實(shí)本身函數(shù)就有點(diǎn)病態(tài),所以也改變不了兩個(gè)區(qū)域的無窮現(xiàn)象 本來找個(gè)視角的圖,,結(jié)果就這 來,,繪制一個(gè)!??! 等等,再插一個(gè),,分段的二維函數(shù)如何繪制,? 就是這個(gè) 其實(shí)對(duì)于分段函數(shù)來說,,你總可以使用if的方式繪制,但是它不優(yōu)雅,。我們干點(diǎn)優(yōu)雅的事情,。 [x,y]=meshgrid(-1.5:.1:1.5,-2:.1:2); z=0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+... 0.7575*exp(-y.^2-6*x.^2).*((x+y>-1)&(x+y<=1))+... 0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1); surf(x,y,z) xlim([-1.5 1.5]); shading flat 一堆錯(cuò)誤,才修完 結(jié)果 這叫關(guān)系表達(dá)式,,就有真或者假兩個(gè)狀態(tài) 視角定義 方位角α x-y平面投影點(diǎn)與y軸負(fù)方向的夾角,,默認(rèn)為-37.5 仰角β為視點(diǎn)和x-y平面的夾角。默認(rèn)為30° view(方位角,,仰角) 改變了視角 [x,y]=meshgrid(-1.5:.1:1.5,-2:.1:2); z=0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+... 0.7575*exp(-y.^2-6*x.^2).*((x+y>-1)&(x+y<=1))+... 0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1); surf(x,y,z) xlim([-1.5 1.5]); shading flat
view(80,10) 默認(rèn) %view(80,10) 快展示一下: 結(jié)果 [x,y]=meshgrid(-3:0.1:3,-2:0.1:2); z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); subplot(224) surf(x,y,z) % 標(biāo)準(zhǔn)視圖 subplot(221) surf(x,y,z) view(0,90); % 俯視圖 subplot(222) surf(x,y,z) view(90,0); % 側(cè)視圖 subplot(223) surf(x,y,z) view(0,0); % 正視圖 代碼 先下載一張照片 注意包保存文件,,不能以數(shù)字開頭 >> W=imread('./unsplash-Oliver Schwendener.jpg'); 注意加; 不然太恐怖了。,。,。 注意tab鍵自動(dòng)補(bǔ)全,放在同一個(gè)文件夾 牛啊 >> imtool(W) 內(nèi)置工具顯示 讀取 >> W1=rgb2gray(W); >> W2=edge(W1); >> figure; >> imtool(~W2) 邊緣圖,,有點(diǎn)好看 下篇文章是關(guān)于微積分的 |
|