第一篇:Simulink一些知識總結
一、set_param 函數的應用
(一)函數調用格式:
set_param(object,param,value),其中object為模塊句柄,param 為參數,value 為參數值。
(二)舉例(1)啟動模型仿真
set_param(gcs,'SimulationCommand','start')(2)精確控制模型仿真步長
set_param(gcs, 'SimulationCommand', 'step'),step 為仿真步長數。(3)設置模塊在模型中的位置
set_param('mymodel/Gain','Position',[50 250 125 275])(4)設置模塊的回調函數
set_param('mymodel/Gain','OpenFcn','my_open_cb')(5)設置模塊的朝向
set_param('mymodel/Gain','Orientation','left')
二、實時改變模塊的參數
單步仿真一次,改變一次參數的值,代碼如下:
set_param(gcs,'SimulationCommand','start')while 1 set_param(gcs,'SimulationCommand','pause')set_param(你的模塊名,'Resistance', 你想改變的值);%這一句你替換一下參數即可
set_param(gcs,'SimulationCommand','step')end
三、上次末狀態作為本次初始狀態進行仿真
問:已經建立好一個數據仿真模型 現在想單獨改變一個參數去觀察參數擾動對結果的影響,例如參數變化范圍是1000 到1500,每7s 的時間讓參數變化100,用什么方法可以實現 ?
答:分次仿真,每次仿真保存末狀態,下一次仿真前更改參數,再倒入上次仿真的末狀態作為初始狀態,設置如下圖:
四、模型加上標題
問:怎么給模型加上標題?
答:雙擊模型空白位置,即可輸入text 文本,并可以設置字體大小顏色等。
五、模型仿真時間與實際運行時間
Simulink 在Normal 模式下的仿真時間是非實時的,如果希望得知自己的模型轉換為實際產品時的運行時間,需要將模型生成C 代碼,下載到硬件目標中去運行并使用Profiler Timer 進行時間的記錄。如處理器在環仿真Processor in the Loop 可以測出模型實際的運行時間。
六、關于模塊參數和模型解算配置的問題
(一)模塊參數的配置:根據用戶算法要求來配置,具體參數意義與使用方法可以雙擊模塊打開對話框后在help 按鈕獲取詳細幫助。
(二)模型結算方法配置:運行仿真的算法一般由解算器提供,分為變步長解算器和固定步長解算器。默認模型選擇變步長解算器的ode45 算法,能夠適應大多數模型應用場景。如果用戶求解剛性模型,需要使用ode23s 之類算法。如果用戶是使用simulink 進行控制算法建模,那么用戶一般使用固定步長解算器以模擬與硬件芯片相同的時鐘頻率。
七、激活stateflow 狀態圖方法
(一)方法一:通過模型的調度時間周期性激活;
(二)方法二:通過trigger 信號去激活。
八、simulink 中過零問題討論
問:simulink 中有哪些過零檢測方法?是否有專門的過零檢測模塊? 答:只有自適應與非自適應兩種選擇,沒有專門模塊,但是很多模塊里有是否使用過零檢測的checkbox,如Relational Operator,switch 模塊等。
九、模塊采樣時間與系統solver 最大步長關系
當模塊的Sample time 設置為-1 時表示繼承父層的采樣時間,如果模塊在子系統里就繼承子系統的采樣時間,如果模塊在最上層模型,就繼承系統solver 的步長作為采樣時間間隔了。另外,如果模塊的采樣時間設置為-1 以外的值,如0 表示連續采樣,這種時刻需要solver 解算器類型支持連續狀態解算;當模塊采樣時間為0.5 這樣的數字表示離散采樣時間,每隔0.5 計算一次,這時要求模塊的采樣時間必須是solver 計算步長的整數倍。
十、solver 步長間隔對仿真的影響
在變步長解算器中,采樣時間間隔(即步長)會根據前后兩次計算值的誤差動態改變。如果設置了最大步長,那么每次的步長就不會超出設置的這個上限。
十一、關于arduino 連接測溫模塊驅動的問題
問:在arduino 上連接一個測溫模塊(如DS18B20),查看DS18B20 的技術手冊,說是利用單總線通訊協議就可以讀取溫度,我想問問在有相關的庫函數及讀取溫度C 程序的情況下,怎么用simulink去驅動測溫模塊工作,并通過串口將溫度傳回PC?
答:有相關的庫函數和C 例程的前提下,就把DS18B20 初始化的API 在model_initialize()中調用,在model_step()中使用讀取溫度的API、當然,在Model.c 文件中包含DS18B20 庫函數所需要的頭文件。
十二、使用S-Function 創建自定義模塊如何避免重復初始化
問:使用S-Function 創建了一個自定義模塊,編寫了有關的模塊TLC 文件,并成功添加入Simulink 函數庫中,但是在使用時發現若同一模型文件中包含兩個以上該模塊,代碼生成時會重復進行初始化,即TLC 文件中%functionStart(block, system)Output 中的內容,如何解決? 答:1.將這部分初始化放到BLockType 的tlc 函數中;
2.使用全局變量對Start 中的TLC 語句進行判斷,僅第一次調用時生成,第二次以上屏蔽。
問:必須要在Start 中進行,全局變量怎么定義?在模塊TLC 中進行定義嗎? 答:是的,當這個變量為TLC_TRUE 時則不再執行Start 函數,直接跳出。否則執行。以保證此函數在整個編譯過程中只執行一次。
十三、關于代碼空間的討論 問:在生成代碼后,如何查看代碼大概會占用多少RAM ROM,還有需要多少堆棧空間?
答:C 代碼看不出來的,在編譯完之后生成了map文件,就可以看到了。
十四、Embedded Coder、Simulink Coder 的關系 問:Embedded Coder 和Simulink Coder 有什么關系?
答:如果你想將Simulink 模型生成C 代碼,那么你需要使用Simulink Coder,而Simulink Coder的運行需要依賴MATLAB Coder,所以,完整的講,如果你需要將Simulink 模型生成C 代碼,需要MATLAB Coder + Simulink Coder;如果你想將Simulink 模型生成為嵌入式C 代碼,那么,除了上述兩個Coder 之外,你還需要Embedded Coder。
十五、關于測量算法在處理器上執行時間問題
問:最近在看論文,看到作者利用示波器探針測量電機MTPA 算法在DSP 上在線計算時間。我現在做了一個標幺化定點后的電流指令表,怎么用示波器測量算法在處理器上執行時間?
答:算法在目標處理器上的執行時間是一個非常重要的數據,我們更多時候關心這個數據的最大值,示波器測量的方式,我覺得不一定能采集到最長時間的情形。在使用MBD 開發軟件的時候,建議使用PIL 獲取這個時間值,可以通過大量的測試用例,獲得這個最大時間值。
答:是的,matlab 的help 關于PIL 的用處也講到其中之一就是測量 execution time,把所需要的測量模塊封裝起來,給定一個輸入向量,下載到目標板上,最后在matlab 窗口上輸入命令,能夠以圖像形式給出關于在此輸入向量下 average time maximum time。
十六、關于Simulink 模型的比較
問:在MBD 項目的工程管理中,模型的比較和差分是一個常見的問題。國外一些公司設計了專門用來對Simulink 模型進行比較和充分的工具,比如德國的medini unite。我想請教一下,各位在進行MBD 設計時,模型比較和差分的問題怎樣解決,都有哪些好用的工具,是否有開放代碼的工具。
答: MATLAB 產品提供了Simulink Report Generator,這個工具具有模型比較功能,也能實現一些模型合并。
十七、S-function builder 參數傳遞問題
問:怎么把s-function builder 中定義的參數傳遞到所集成的C 語言源文件中? 答:在Data Properties 的頁面中定義參數的變量名何參數,如pvar。然后在Outputs, Discrete Update 等子頁面中都可以使用變量名和下標訪問參數值,如pvar[0]。使用這個變量名編寫C代碼,完成所有配置之后點擊build,就可以將你寫的C 代碼打包集成到生成的C 文件中去了。
十八、快速原型和硬件在環的區別 問:快速原型和硬件在環的區別?
答:快速原型,也就是控制器快速原型的簡稱,顧名思義,就是對Simulink 算法進行控制器功能的快速實現。一般來講,你可以通過工控機,快速實現控制算法,而不必對控制算法進行代碼生成相關的配置和設置。然后,你可以用這個工控機實現的控制器和被控對象相連,形成閉環,實現在真實被控對象上對控制算法的驗證或者參數調節。硬件在環,是對控制器進行測試的一個環節,在實現了控制器軟件和硬件的集成之后,這時候我們并不能確保控制器一定是正確的,如果這個時候直接把控制器和一些被控對象連接,可能造成財產或者人身傷害,在這種情況下,我們一般會通過工控機去模擬一個被控對象,然后把控制器和這個工控機相連,進行控制器相關測試。
十九、tlc 文件該怎么編寫 問:tlc 文件該怎么編寫?
答:在Simulink Browser 中搜索S-Function,從example 模塊中找到帶有tlc 的例子,參考編寫即可。另外可以閱讀Embedded Coder 的User Guide 里面詳細介紹了tlc 的編寫方式。
二十、C MEX S-Function 延時功能
問:現在需要做一個PWM 波形輸出的S 函數,想利用延時功能進行高低位的切換,但是不知道C-MEX 的S 函數怎么寫延時。
答:
1、利用狀態變量記錄輸入,在下幾個采樣時間后再輸出;
2、直接輸出,使用unit delay 實現延時。
二十一、S-Function 生成代碼如何添加自定義的頭文件
問:我用S 函數做了一個簡單的s12xdp512 的Digital Output 的驅動模塊,生成代碼時一直報錯Error Test.c: 28 undeclared identifier PORTA' Error Test.c: 41 undeclared identifier `DDRA'。顯示的“PORTA”和“DDRA”都是在單片機的頭文件“mc9s12xdp512.h”中完成定義的,如何在tlc 文件中定義該頭文件,以便生成代碼時不會報錯,代碼生成后不用手動添加?
答:PORTA”和“DDRA”都是在單片機的頭文件“mc9s12xdp512.h”中完成定義的,你的Test.c 中有必要使用它們嗎?當生成代碼時S 函數主要完成將GUI 用戶設定參數通過一系列中介文件傳遞到tlc 文件中去,最后生成的C 文件跟已有頭文件Merge 之后再使用IDE 編譯生成目標文件下載到硬件中去。二
十二、PIL 測試時主機和DSP 的連接問題
問:PIL 測試時,主機和DSP 的連接,到底是用串口,USB 口,還是下載程序的JTAG 口?
答:串口和USB 口都是可以用的,串口的話需要
提供DSP 的串口驅動代碼,USB 的話,PC 端和DSP端的都需要編寫,JTAG 就不確定了。
二十三、simulink 封裝的模塊Initialization有什么作用 問:simulink 封裝模塊Initialization 有什么作用,如何寫這個Initialization?
答:模塊的 Initialization Commands 執行的時刻包括以下幾個情況:
1、在 Icon draw Commands 或 Initialization Commands 里更改封裝的參數時;
2、當 Icon draw Commands 有內容時,翻轉或旋轉模塊;
3、雙擊打開模塊的參數對話框或點擊參數對話框上的 Apply/OK/Cancel 關閉對話框時。
二十四、simulink 生成C 代碼的問題
問:如果在simulink 中通過將模型生成C 代碼,但又想通過其他軟件如LabVIEW 調用此C 代碼,那么在simulink 中生成的C 代碼需要進行一些手動修改,還是說自動生成的C 代碼就可以進行使用?
答:在選擇系統TLC 文件時要根據你的需要進行選擇。如果是為了生成嵌入式C,則選擇ert.tlc文件; 如果是為了VC++ 環境使用,則選擇grt.tlc(for VC++),Labview 里面你要調用此代碼,是指調用其中某個函數吧,如model_step(),將生成的代碼放到可搜索路徑下直接調用應該就可以了。二
十五、simulink 生成C 代碼再轉化為DLL 文件的問題
問:通過simulink 中編寫仿真模型,再將模型生成為C 代碼,在VC 中生成DLL 文件,最后通過LabVIEW 調用DLL 文件,以實現混合編程的目的,應該怎樣實現? 答:系統目標選擇ert_shrlib.tlc,可以在生成代碼的同時生成dll 文件。二
十五、Simulink 多個模塊生成代碼順序問題
問:在自動代碼生成的時候,把一個模塊的代碼放到最前面,想知道模塊生成代碼的放置順序是通過什么來配置的?
答:如果有信號線連接的話,執行順序按照信號流向(前提是DirectFeedThrough 設置正確)。沒有信號連接的模塊,郵件屬性可以設置Priority。數字大表示優先級低。
二十六、如何封裝手寫底層代碼
問:有沒有一種方法能夠將手寫的底層c 代碼封裝在matlab 的庫中,以后可以與simulink 自動生成的代碼做接口的?
答:TSP 開發比較花費時間。Legacy Code Tool對既有驅動代碼的耦合性有要求,太過復雜的結構無法直接應用LCT。但是可以手動開發。一般包括幾個步驟: 1.模塊和參數對話框制作 2.模塊S 函數開發 3.模塊TLC 文件開發
除了驅動模塊之外,還有系統目標文件和一系列回調函數的開發。共同構成支持某一個目標芯片的驅動庫。二
十七、生成代碼該注意什么問題 問:生成代碼該注意什么問題
答:要生成代碼必須使用支持生成代碼的模塊,連續模塊一般不支持代碼生成,示波器等顯示模塊也不行。要生成代碼,需要確定生成代碼的類型,是嵌入式代碼還是一般Windows 應用程序代碼或其他類型代碼,可以選擇對應的System Target File,嵌入式通用代碼選擇ert.tlc, 快速原型代碼使用grt.tlc.如果是為了使用各個芯片廠商提供的芯片,最好還要安裝它們提供的TSP 工具箱和工具鏈,那里面會有配套的tlc 文件。二
十八、編寫S 函數時,采樣時間的設計
問:在編寫S 函數時,初始化模塊有關采樣時間ts=[x1 x2],連續系統時設置為ts=[0 0];如果是離散系統,采樣時間為h,那么可以寫為ts=[h 0]嗎?例如20us 采樣一次,該怎么設計呢?
答:系統solver 設置為固定步長,設置為20us,然后在S 函數里設置采樣ts = [-1, 0]來繼承系統采樣時間。二
十九、連續狀態是否支持自動代碼生成 問:連續狀態是否支持自動代碼生成? 答1:含有連續狀態的模塊不支持代碼生成。因為要生成代碼解算器必須是固定步長的,但是此種解算器不支持連續狀態解算。答2:定步長連續1 階積分好像可以生成代碼,剛開始用dSPACE 的時候全選的是這個,后來才開始用離散。
答3:是的,ode3 等定步長算法也支持代碼生成。看來連續模塊不能生成代碼的原因還需要討論。
三
十、sine wave 模塊中Sample based 和 Time based 的區別 問:sine wave 模塊中Sample based Time based的區別在哪里?
答:Sample based 基于采樣,Time based 基于時間,兩種計算正弦的數學公式,根據你使用情況需要選擇,如果你只有輸入時間t 采用基于時間。如果是離散系統,一般使用采樣點的序號來計算正弦。三
十一、simulink 中如何輸入帶參數的傳遞函數
問:如何輸入分子為s+a,分母為s^2+2bs+b^2的傳遞函數?a,b 其實不是變量,只是由其他模塊計算而來的。
答:transfer fcn 模塊支持輸入變量,變量只要定義在Workspace 里即可。三
十二、rtw 文件與tlc 文件的生成順序 問:rtw 文件與tlc 文件的生成順序是怎樣的?
答:先寫C 文件,編譯成mex 之后才可以被模型調用,S 函數模塊里的參數配置要正確,之后build 才能生產rtw。tlc 再從rtw 里面獲取信息,進行代碼生成。三
十三、M 語言編寫的S 函數是否支持代碼生成 問:M 語言編寫的S 函數是否支持代碼生成?
答:M 語言編寫的S 函數也是有兩種的,Level 1和Level2,Level1 僅支持仿真,不支持代碼生成。Level2 支持代碼生成。三
十四、如何在模型里面嵌入C 代碼
問:某部分內容是c 代碼封裝的,如何在代碼生成時把該部分代碼直接連接添加?
答:可以使用custom code 模塊,直接添加C 代碼到模型中并生成到指定的位置,不進行仿真也不確保代碼正確性。三
十五、Stateflow 如何代碼生成共用體
問1:stateflow 的RTW 自動代碼生成,怎么設置才能生成c 語言的共用體? 答1:樓主可以在Custom code 里面定義共同體,將此文件作為頭文件包含,然后在Stateflow 模型里使用此共同體變量或其成員,生成代碼時會自動Merge 在一起。
問2:Stateflow 使用的時候,signal 的屬性怎么弄?比如:data type。答2:Stateflow 的運行都是要先生成C 代碼,再編譯成動態鏈接庫文件(mex),然后才能運行的。所以,在custom code 設置通過C 代碼或者C 文件定義出來的函數或者變量,只要符合C 語言語法規則,就可以被用到Stateflow 模型的各種action 里。
三
十六、如何將simulink 自動生成的代碼中如何使用外部RAM 問:因為程序太大,想在SIMULINK 自動生成代碼時直接將PAGE1 定位到外部RAM,請問如何設置?
答:通過數據對象的方式定義各類數據,使其定義到期望的RAM 區域。在手工編碼的時候,遇到你說的這種情況,我們一般會通過在link 文件中定義RAM 段,然后在C 文件中定義變量的時候,通過pragma 關鍵字,把這些變量定義到預先設定的地址段里。所以,你做自動代碼生成的時候,也需要生成出來通過pragma 定義的變量,這需要你通過數據對象的方式實現,并且,這種情況下,需要自定義Package,以及package 里的類,在類的屬性storage class 里設置pragma。然后生成的代碼里,就可以有類似于以下的代碼: #pragma section_A begin int8_T var1;int16_T var2;............#pragma section_A end 這樣var1、var2 等就被定義到section_A 存儲區域了。
三
十七、如何拆分生成的代碼中model_data.c里面定義的parameter 結構體? 問:在使用simulink embedded coder 生成的代碼中,會將模型中的lookup table、constant 常數等統一放在了一個叫parameter 的結構體內(也就是在model_data.c 里面定義的數據)。由于整個模型中的lookup table 很多,導致這個結構體及其龐大,初步估計有7K byte 大小。請問有沒有辦法拆分這個結構體的體積?
答:使用數據對象定義這些參數,就可以不用放到model_data.c 文件了。三
十八、目標文件ert.tlc 與grt.tlc 的區別 問:grt 與ert 的區別在哪里?各自作用如何?
答:grt 中的g 表示general,ert 中的e 表示embedded,兩個文件都是系統目標文件,使用grt.tlc 作為系統目標文件,生成的代碼可以用作快速原型,而ert.tlc 生成的代碼可以用于嵌入式系統。ert.tlc 生成的是更高效的代碼。三
十九、關于觸發子系統的總結 當系統內部不存在積分環節時:
1.觸發子系統內外不能使用goto 和from 模塊傳遞信號,這是由atomic 子系統屬性決定的
2.觸發子系統內的模塊采樣時間只能是inf 或者-1,即繼承采樣時間;當子系統內部有信號源時需注意該點
3.觸發子系統的工作特性是在觸發的一瞬間輸出系統內該時刻的值,然后保持;觸發子系統只可選擇held 信號,而不能reset 信號。
4.觸發子系統有信號源與外界接入信號源效果是一致的,但是內部信號源要修改采樣時間為-1 5.子系統內的信號顯示很有意思,是第一次觸發開始的值到最后一次觸發結束的值;中間數值都是保持狀態。當系統內部存在積分環節時:觸發子系統內部有積分環節并且需要改變積分初值,這個問題沒有解決例如testforsubsystems中triggered subsystem。四
十、關于使能子系統的總結
1.當系統內部不存在積分環節時:使能觸發子系統相當于一個觸發子系統,使能環節的作用應包含在了觸發子系統之內。
2.當系統內部存在積分環節時:使能觸發子系統解決了觸發子系統的有積分環節時不能解決的問題。四
十一、switch 的使用說明
該模塊共有三個輸入,其中第二個(即u2)為控制信號的輸入,將其與閥值或者0 進行判斷,判斷類型有:大于等于閥值、大于閥值、不等于0 三種類型,默認判斷為真時輸出第一個信號,否則輸出第三個信號。
第二篇:通信原理課設文檔simulink
《通信原理》課程設計
開機,啟動Matlab,在工作窗口Simulink。
模塊庫——>各個模塊 Simulink:基本模塊庫
Commuinications Blockset:通信模塊庫 Signal Processing Blockset:信號處理模塊庫
基本原理:
1. 信源
通信工具箱:Communications Blockset——Comm Sources/Rondom Data Sources 選擇:Bernoulli Binary Generator二進制伯努利序列產生器
Random Integer Generator 隨機整數產生器 Signal Processing Blockset——signal Processing Sources
Sine Wave正弦波 2. 噪聲源
Communications Blockset——Comm Sources/Noise Generators 選擇:Gaussian Noise Generator高斯白噪聲產生器
Rayleigh Noise Generator瑞利噪聲產生器
Uniform Noise Generator均勻噪聲產生器 3. 示波器
Simulink——〉Sinks——〉Scope 4. 相加器、增益、相乘器 Simulink——〉Math Operations——〉Add、Gain、Produc 5. 信道
高斯白噪聲加性信道
Communications Blockset—〉Comm Sources—〉Noise Generators—〉Gaussian Noise Generator 6. 濾波器
Signal Processing Blockset——〉Filtering——〉Filter Designs——〉Digital Filter Design 低通濾波器的帶寬:基帶信號的帶寬
帶通濾波器的帶寬:載波頻率±基帶信號的帶寬 7. Relay(抽樣判決器)
Simulink——〉Discontinuities——〉Relay 這是一個滯環比較器,一般用來作為調節有波動的系統時的緩沖。
parameters里的設置為:switch on point-閾值上限,switch off point-閾值下限,output when on-閾值上限輸出值,output when off-閾值下限輸出值。
例如某個信號的閾值上限為1.5,下限為0.5,上限輸出為1,下限輸出為0.當該信號上升到大于1.5時,relay的輸出為1。若信號下一個周期小于1.5,但仍大于0.5時,其輸出仍保持為1。只有當信號下降到小于0.5時,才會輸出0。
它的意義是使信號調節有一個足夠的范圍寬度,而不至于因為每個周期都進行調節。8. 眼圖、星座圖、誤碼率
Communications Blockset—〉Comm Sinks——〉Discrete-Time Eye Diagram Scope ? Samples per symbol:每個符號的采樣點數,自己計算1個二進制碼元在系統中有多少個采樣點,也就是要保證眼圖窗口的時間寬度為整數個碼元寬度(最好1、2個)。? Offset:非負整數,小于Samples per symbol和Samples per trace的乘積,指定在畫第一個點時省略的采樣點數。可調。
? Samples per trace:正數,指定每一條軌跡的符號數目。如2,顯示兩個符號周期。? Traces displayed:疊加的軌跡的數目。
? New traces per display:正整數,小于Traces displayed,指定每一次顯示時新軌跡的數目。
? Rendering Properties:線型和顏色設計 ? Axes Properties:x、y軸范圍設計
? Figure Properties:眼圖顯示的數據類型設計
Communications Blockset—〉Comm Sinks——〉Discrete-Time Scatter Plot Scope Communications Blockset—〉Comm Sinks——〉Error Rate Calculation
第三篇:實驗報告 5 Simulink仿真
實驗五 Simulink仿真
(一)一、實驗目的
1、熟悉Simulink仿真環境
2、了解Simulink基本操作
3、了解Simulink系統建模基本方法
3、熟悉Simulink仿真系統參數設置和子系統封裝的基本方法
二、實驗內容
1、在matlab命令窗口中輸入simulink,觀察其模塊庫的構成;
2、了解模塊庫中常用模塊的使用方法;
3、已知單位負反饋系統的開環傳遞函數為
G?100s?2s(s?1)(s?20)
建立系統的模型,輸入信號為單位階躍信號,用示波器觀察輸出。
4、建立一個包含Gain、Transfer Fcn、Sum、Step、Sine Wave、Zero-Pole、Integrator、Derivative等模塊構成的自定義模塊庫Library1;
5、建立如圖7-12所示的雙閉環調速系統的Simulink的動態結構圖,再把電流負反饋內環封裝為子系統,建立動態結構圖。
三、實驗結果及分析:
圖5-1
圖5-2
圖5-3
圖5-4雙閉環調速系統的Simulink的動態結構圖
圖5-5把電流負反饋內環封裝為子系統的動態結構圖
雙擊Subsystem模塊,編輯反饋電流環Subsystem子系統,如圖5-6所示:
圖5-6
分析:Simulink是Mathworks開發的MATLAB中的工具之一,主要功能是實現動態系統建模、仿真與分析。可以在實際系統制作出來之前,預先對系統進行仿真與分析,并可對系統做適當的適時修正或按照仿真的最佳效果來調試及整定控制系統的參數,達到提高系統性能。減少涉及系統過程中的反復修改的時間、實現高效率地開發系統的目標。Simulink提供了建模、分析和仿真各種動態系統的交互環境,包括連續系統、離散系統和混雜系統,還提供了采用鼠標拖放的方法建立系統框圖模型的圖形交互界面。
第四篇:Matlab與Simulink仿真學習心得
Matlab與Simulink仿真學習心得
班級:07610 學號:072016 姓名:呂天雄
一 Matlab學習心得體會與編程實踐
<1>學習Matlab的心得體會
真正開始接觸Matlab是大二上就開始了,到現在已經一年多了,在此之間,Matlab的確為我提供了很多便利。Matlab的確不愧成為是草稿紙上的語言。我們不必去為很簡單的顯示效果圖形去找一些什么其他軟件或者研究比較復雜的計算機圖形學,一個plot或者別的函數往往就可以得到很滿意的效果。
其實最初開始學習matlab的時候感覺這個東西和C沒什么兩樣,但是后來具體到一些 東西,比如信號處理和數學建模上以后才感覺到使用matlab編寫程序去驗證結果比C要節 省很多時間,而且matlab寫東西基本都是按照自己的思路平鋪直敘很少去考慮什么函數的 嵌套調用或者指針等等很頭疼的東西。
關于matlab的學習,我感覺其實百度和matlab自帶的help基本能夠解決絕大數問題,而且一些比較好的論壇比如www.tmdps.cn都會為你產生很大的幫助,關鍵是在于多動手實踐,多思考。但是matlab畢竟只是一個工具,原理和一些基本的編程素質還是必須有的,否則matlab最多也只能是驗證一些別人的東西而已,根本幫不上什么忙的。
<2>遇到的一些問題的思考方式與解決辦法
最開始用matlab的時候是在大物實驗,實驗要求去根據測量得到的數據作出圖。但是 手動用鉛筆去畫確實很麻煩,所以用matlab確實可以省去很大的麻煩。但是第一次遇到問 的時候是有關極化坐標下的曲線擬合。
首先是一個物理實驗的問題;在做一個關于光的偏振的實驗的時候,最后的結果要在一個極化坐標下顯示出來;因為數據是離散的,所以顯示出來的圖像是一個折來折去的一個東東; 然后很自然的想法是對這個曲線進行插值處理。
但是極化坐標下MATLAB并未提供插值處理的函數,interp1這個函數只能在笛卡爾坐標系,也就是直角坐標系下使用。
然后就想到把極坐標的數據轉換的直角坐標系下,pol2cart可以實現這個想法,但是隨后而來,也就是最后導致整個問題失敗的關鍵也在這里。
pol2cart以后產生的一串數據中出現了重復的數據,那么interp1這個東西也就無能為力了,因為interp1不能處理一串數據中有重復出現的情況。最后的處理辦法是把這些數據c os,sin這些東西變換一下后,使其大致規則,然后再用polar畫出極坐標下的圖形。
接下來這個問題就有點超過我的范圍了,可能會有點敘述不清楚。問題可以概要為:人臉網格插值。
這是一個用三角形網格表示的一個人臉模型。需要通過插值使其變得光滑,當然問題的復雜之處在于,插值會改變原本的網格結構。
對于這個問題許多人都給出了解決的辦法,當然是一些關于人臉識別技術和運動圖像處理的范疇之內的。
主要有兩種,第一種是face—ls算法。這種算法是基于RBF(徑向插值函數)和loop細分原則的一種算法,當然其精確程度比較差點。但是速度挺好。原理是:基于網格上的點,產生出頂點的迭代函數,從而產生出新的定點,進行細化。然后進行插值。也就是引進新的頂點。分為兩個過程內部插值和邊緣插值。具體可以去看蘭州大學信息工程學院的學報。
第二種也就是基本的老辦法RBF。首先解釋一下什么叫做徑向插值 徑向基函數
主要是考慮多維空間的數據插值問題,徑向基函數在三維圖形的變形中常常被采用,用其來變分三維人臉的時候還應結合人臉的固有特征。確定該方法來實現三維人臉變形是可行的,但要構造好的基函數,以及解這些高維方程的解仍是難點。插值方法:
假設大多數人臉的形狀都可以由一個拓撲原型變化得來,那么,通過調整一個一般模型的構造參數可以建立不同的面部模型。但是,這種參數模型僅僅局限于那些構造參數已知的情況,并且對特定人臉參數的調整非常困難。在離散數據的多變量插值問題方面,徑向基函數(radial basis function,RBF)插值方法是一個行之有效的工具,所以也適用于類似人臉這樣高維曲面的近似或平滑插值。現有的許多方法使用了基于RBF的插值技術,將一般人臉網格變化到特定人臉的形狀。這種方法的優點在于:(1)通過插值可以得到丟失的數據點,所以源網格和目標網格不需要相同數目的結點;(2)如果選擇了合適的匹配點,數學上可以保證能夠將源網格變形到目標網格。
當然我也不是很懂,只是理解了部分。這種方法的關鍵是找到一個很好的核函數來計算出新的頂點。
最后問題解決的方式是查著了一些圖書館的學報。然后而且在網上找到了部分代碼。然后做出來的。這是我校大四一個同學畢設中的一個東西。
其實這個事件最好的解決辦法是在3D-MAX中,不過因為沒能找到MATLAB與3D-MAX是怎么接口的,所以作罷了。
第三次遇到的問題是我在數學建模課上遇到的一個關于矩陣LU分解的問題:
Matlab作出的結果和手算的結果竟然不一樣。
10??1????1???1?
U=?1? ?一個矩陣 A=? 經過三角分解為L=101????????11?因為1/?為一個極大數 則1—1/?可以看成—1/?;
設?=0.***000000001%10的負24次方
從而L*U=則最后一位1沒有了 變成了0
其中L=
U=Matlab 程序為
epusino=0.***000000001;U=[epusino 1;0-1/epusino];L=[1 0;1/epusino 1];L*U ans =
0.***
1.***
1.***
0 而直接用lu函數對矩陣A分解的結果為
A=[epusino 1;1 1] A =
0.0000
1.0000
1.0000
1.0000
>> [L,U]=lu(A)L =
0.0000
1.0000
1.0000
0
U =
0 我們老師當時的解釋是這是由于我們所用matlab是破解版的緣故,破解版的計算精度 沒正版的高所以導致運算結果的錯誤,后來我看了一些LU這個函數的help文檔 psychologically lower triangular matrix"(i.e.a product of lower triangular and permutation matrices)in L。翻譯過來是L是一個心理上的下三角矩陣,其實是下三角矩陣和置換矩陣也就是最后的結論。P*A = L*U.。由此可見這并不是什么精度的問題導致的結果只是LU分解的矩陣意義和書本上的不同而已。
以下是我自己寫的一些程序的代碼
1:網絡隨機拓撲圖
目的是要生成一個度數隨機、權值隨機的拓撲圖。首先的理解是利用鄰接矩陣,先隨機生成一個矩陣,該矩陣為一個對稱矩陣。然后畫出這個矩陣就行了。
隨機拓撲圖10026516398191 ***0430 ***065
%產生數組A用來存放表示兩點之間權值的矩陣A,也就是臨接矩陣,那么兩點之間權值不為零元素的個數即為該點的度數
DEF=5;%設定一個東東 方便改變隨機點的個數 A=rand(DEF,DEF);%產生DEF*DEF的隨機矩陣 for i=1:DEF A(i,i)=0%將對角線上的數置為0 end A=10*A;A=floor(A);%向下去整 for i=1:DEF for j=1:i A(j,i)=A(i,j)%將A矩陣變為一個上三角或者下三角矩陣 end end x=100*rand(1,DEF);y=100*rand(1,DEF);%產生10個隨機的點 plot(x,y,'r+');
for i=1:DEF a=find(A(i,:)>0)%將A矩陣每行大于0的數的在該行的地址找出來放在a中
for j=1:length(a)
c=num2str(A(i,j));%將A中的權值轉化為字符型
if c~='0'%不顯示為0的值 因為A矩陣為零代表兩點不相連 text((x(i)+x(j))/2,(y(i)+y(j))/2,c,'Fontsize',18);%將權值顯示在兩點連線中間 end hold on;
line([x(i)x(a(j))],[y(i)y(a(j))]);%連線 end end
title('隨機拓撲圖');e=num2str(DEF);legend(e);%左上角顯示節點的個數 for m=1:DEF A(m,m)=m;f=num2str(A(m,m));hold on;text((x(m)+x(m))/2,(y(m)+y(m))/2,f,'Fontsize',18);%將權值顯示在兩點連線中間 end 接下來是一個在信息安全課上寫的一個關于256色圖分層的程序,一副圖像有m*n個像素然后每個像素是一個8bit的二進制數據換算為十進制是0-255之間。要做的就是把每bit的信息提取出來。
I=imread('bupt副本.bmp');%讀入源圖像
I=double(I);%將圖像轉換為double類型便于MATLAB中的計算 %確定圖像的長寬 M=size(I,1);%長 N=size(I,2);%寬 l=M*N;%圖像長寬之積 for n=1:8;%剔除每層 for i=1:M
for j=1:N
B=numdec2bin(I(i,j),8);%先將每個像素轉換為8位2進制序列
B(n)=[];%刪除相應位置的元素
y(i,j)=numbin2dec(B);%將剩下的7個元素轉換為10進制數放入y矩陣中
end end
y=uint8(y);%將10進制的矩陣轉換為無符號整形
subplot(4,2,9-n);%顯示n個圖像,每層是相應的剔除該層的結果
imshow(y);%顯示這個圖像
title(strcat('去除第',num2str(9-n),'層后的結果'));%顯示標題 end
附帶的兩個函數:
function y=numdec2bin(x,n);%從函數將十進制數x轉化為n位二進制 y=zeros(1,n);a=x;i=n;while a>0 y(i)=mod(a,2);a=floor(a/2);i=i-1;end function y=numbin2dec(x)%將二進制數轉換為十進制數 a=0;lx=length(x);for i=1:lx a=a+x(i)*2^(lx-i);end y=a;
去除第1層后的結果去除第2層后的結果去除第3層后的結果去除第4層后的結果去除第5層后的結果去除第6層后的結果去除第7層后的結果去除第8層后的結果
Matlab的RGB轉換為YCbCr之后轉換回來和原圖不符
這個是做JPEG圖像壓縮的時候遇到的一個問題,當時的代碼是用C寫的但是結果不對,后來想到用matlab進行驗證結果發現通過公式轉換得到的圖是錯的。
原理:BMP圖像壓縮為JPEG的第一步是將RGB色彩空間通過這個公式映射到YCbCr空間上。
Y=0.299 R + 0.587 G + 0.114 B Cb =0.3313G + 0.5 B + 128 Cr = 0.5 R0.0813 B + 128 然后再進行量化,DCT,編碼等等步驟。JPEG解壓時需要將YCbCr空間的圖像又轉化回來到RGB上。
R = Y + 1.402(Cr0.34414(Cb-128)128)
B = Y + 1.772(Cb-128)
但是通過書上給的公式和網上大部分公式卻發現根本轉化不會來。下面是寫的程序代碼以及測試得到的結果圖像。
clc,clear;Source=imread('hl.jpg');%讀入原始RGB圖像
figure(1);subplot(1,2,1);imshow(Source):title('original image');%顯示圖像 [r c d]=size(Source);%計算圖像大小 %------計算紅色分量并顯示分解圖------% R(:,:,1)=Source(:,:,1);R(:,:,2)=zeros(r,c);R(:,:,3)=zeros(r,c);R=uint8(R);whos;figure(2);subplot(1,3,1);imshow(R)title('Red Component');%-------計算綠色分量并顯示分解圖-------% G(:,:,2)=Source(:,:,2);G(:,:,1)=zeros(r,c);G(:,:,3)=zeros(r,c);G=uint8(G);figure(2);subplot(1,3,2);imshow(G)title('Green Component');%--------計算藍色分量并顯示分解圖-------% B(:,:,3)=Source(:,:,3);B(:,:,1)=zeros(r,c);B(:,:,2)=zeros(r,c);B=uint8(B);figure(2);subplot(1,3,3)imshow(B)title('Blue Component');%------------合成-------------% Comp(:,:,1)=R(:,:,1);Comp(:,:,2)=G(:,:,2);Comp(:,:,3)=B(:,:,3);figure(1);subplot(1,2,2);imshow(Comp):title('composition image');Y=0.229*R+0.587*G+0.114*B;Cb=0.5*B-0.1687*R-0.3313*G+128;Cr=0.5*R-0.4187*G-0.0813*B+128;red=Y+1.402*(Cr-128);green=Y-0.34414*(Cb-128)-0.71414*(Cr-128);blue=Y+1.772*(Cb-128);Comp2(:,:,1)=red(:,:,1);Comp2(:,:,2)=green(:,:,2);Comp2(:,:,3)=blue(:,:,3);figure(3);imshow(Comp2);title('RGB轉換為YCrCb后又轉換為RGB的圖像');RD=R(:,:,1)-red(:,:,1);GD=G(:,:,2)-green(:,:,2);BD=B(:,:,3)-blue(:,:,3);figure(4);subplot(1,3,1);imshow(RD);title('紅色分量差異');subplot(1,3,2);imshow(GD);title('綠色分量差異');subplot(1,3,3);imshow(BD);title('藍色分量差異');
然而可以通過figure(4)的圖像清楚看到R 和G分量轉換后恢復 與以前的差別很大。而且看了一下matlab自帶的rgb2ycbcr和ycbcr2rgb并且用了這兩個函數測試后圖像是一樣的。很是不解
實驗得到的圖為: original imagecomposition image
將源圖像分為RGB三個部分。
Red ComponentGreen ComponentBlue Component
將源圖像的RGB分量轉換到YCbCr上后又轉化為RGB得到的三個分量差異的圖。
紅色分量差異綠色分量差異藍色分量差異 公式轉換的y分量公式轉換的cb分量公式轉換的Cr分量matlab函數轉換的y分量matlab函數轉換的Cb分量matlab函數轉換的Cr分量
從最后的結果可以看出原圖轉換到YCbCr空間之后又轉化回來得到的圖像與原圖不符….RGB轉換為YCrCb后又轉換為RGB的圖像
以上只是我自己用Matlab做過的部分問題,還有一些比如場聲源定位Music算法仿真,DES加密算法。神經網絡濾波器等等,鑒于代碼量太大,就不再敖述。二 Simulink學習心得與編程實踐
SIMILINK模塊庫按功能進行分類,包括以下8類子庫: Continuous(連續模塊)Discrete(離散模塊)
Function&Tables(函數和平臺模塊)Math(數學模塊)
Nonlinear(非線性模塊)
Signals&Systems(信號和系統模塊)Sinks(接收器模塊)Sources(輸入源模塊)
對于simulink來說其實沒什么好說的,需要什么就把什么拖到Model里面,連線之后設定參數。不是很麻煩的。但是重要的是對于系統的設計與仿真思想才是最重要的。而且里面的S-Function也是比較好的一個設計,用S-Function可以自定義一些組件,使自己的仿真看上去更加清晰與精簡。
Simulink的工作方式:
(1)模塊內的參數值首先會送到Matlab中進行計算,得到的參數值會用來當做以后需要調用的參數。
(2)模型系統中的各個層級將被平展開來,每一個子系統將被相應的模塊所代替。(3)模塊按被處理的順序排列,此時代數回路結構也被檢查出來,此種排列產生一個列表,以確保具有代數回路的模塊驅動輸入的模塊被更新后才更新。
(4)檢查塊之間的鏈接,是否每一個塊的輸出端口與它所連接的模塊輸入端口有相同的信號寬度。
現在可以準備執行仿真操作,仿真時使用數值迭代求的的結果,每種數值積分模型提供的連續狀態的微分能力。
Simulink中的模型都是分級的,因此可以通過自上而下或者自下而上的方式建立模型。定義了一個模型以后,就可以通過Simulink的菜單或者在Matlab的Command中輸入命令進行仿真。
關于學習的心得就寫到這里了,接下來是一些自己做的仿真。
1:觀察一個信號與積分之后的區別,目的是了解Scope的功能和用法。
仿真結果,左邊為原始信號,右邊為積分后的信號。
用XYGraph看到的對比
Rossler吸引子產生仿真:
Rossler 吸引子產生是服從下面這個方程的 1
212 331
仿真圖 ???(x?x)x??x?axx??b?x(x?c)xa?b?0.2c?5.7
仿真結果
LMS自適應濾波器: 仿真圖:
遇到的問題
問題的解決辦法:
將Spectrum Scope中的buffer input打勾就行了。
仿真結果圖形:
1:Spectrum Scope的輸出圖形
2:Vector Scope的輸出結果
3:Scope的輸出結果圖形
第五篇:MATLAB實驗六《SIMULINK交互式仿真》
《計算機仿真及應用》實驗教案
實驗六 SIMULINK交互式仿真
一、實驗目的
1、熟悉SIMULINK交互式仿真集成環境。
2、掌握連續時間系統建模的方法。
二、實驗主要儀器與設備
裝配有MATLAB7.6軟件的計算機
三、預習要求
做實驗前必須認真復習第七章SIMULINK交互式仿真集成環境。
四、實驗內容及實驗步驟
示的SIMULINK模塊庫瀏覽器。
《計算機仿真及應用》實驗教案
圖7.2 SIMULINK模塊庫瀏覽器
4、開啟空白(新建)模型窗
單機Simulink模塊庫瀏覽器工具條上的圖標“去的)。
5、從模塊庫復制所需模塊到空白(新建)模型窗(見圖7.3)
把連續模塊子庫中的積分器
”;或在選擇下拉菜單項{File:
New},引出如圖7.3所示的空白模型窗(注:窗中的模塊是后一個步驟復制進
《計算機仿真及應用》實驗教案
7.3 制進庫模塊的新建模型窗
6、新建模型窗中的模型再復制
在該新建模型窗中,可以通過再復制,產生建模所需的2個積分模塊和2個增益 模塊。具體操作方法是:按住[Ctrl]鍵,用鼠標“點亮并拖拉”積分模塊
見一個所需的增益模塊,可采用類似方法獲得。
7、模塊連接線的形成方法隨信號起始端位置不同而不同,具體如下。
起始端位于模塊輸出口的信號線生成法。使光標靠近模塊輸出口;待光標變 為“單線十字叉”時,按下鼠標左鍵;移動十字叉,拖出一根“虛連線”;光標 與另一個模塊輸出口靠近到一定程度,單十字叉變為雙十字叉;放開鼠標左鍵,”虛連線”便變為帶箭頭的信號連線。
起始端位于其他信號線上的信號線生成法。使光標置于已經存在的其他信號線 之上;按下鼠標右鍵,光標變為“單線十字叉”;運動鼠標,引出”虛連線”;當 鼠標與待連接模塊輸入口靠得足夠近,單十字叉變為雙十字叉;放開鼠標右鍵,“虛連線”便變為帶箭頭的信號連線。
雙擊相應的信號線,給信號線作標注,如x’’,x’,x等。
《計算機仿真及應用》實驗教案
圖7.4
已構建完成的新建模型窗
8、根據理論數學模型設置模塊參數
為使構造的Simulink模型與理論數學模型一致,須對模塊進行如下參數設置。
設置增益模塊
《計算機仿真及應用》實驗教案
修改求和模塊輸入口的代數符號:雙擊求和模塊,引出如圖7.1-6所示的參數設置窗; 把符號列表欄中的默認符號(++)修改成代數符號(--);單擊【OK】鍵,完成設置;
圖7.6 改變輸出入口符號的求和模塊參數設置窗
據初始位移x(0)=0.05m對積分模塊
《計算機仿真及應用》實驗教案
圖7.7 實現初始化位移0.05設置的Integrator1設置窗
9仿真運行參數采用默認解算器“ode45”、默認“變步長”和默認仿真終止時間10.10把新建模型保存為exm070101.mdl.11試運行,以便發現問題加以改善。
雙擊
”仿真啟動鍵,使該模型運行;在示波器上呈現
圖7.8 坐標范圍設置不當時的信號
《計算機仿真及應用》實驗教案
單擊Scope顯示窗上的縱坐標范圍自動設置圖標“”,示波器顯示窗改變為圖7.9所
示。在顯示窗中,可以看到位移x(t)的變化曲線。同時可以發現:縱坐標的適當范 圍大致在【-0.06,0.06】;仿真時間取【0,5】即可;顯示的曲線不夠光滑。
圖7.9 采用軸自動設置功能的信號顯示
12、據試運行結果,進行仿真參數的再設置
示波器縱坐標設置:用鼠標單擊示波器的黑色顯示屏,在彈出菜單中選擇Axes Properties,引出縱坐標設置對話窗7.10所示;把縱坐標的下限、上限分別設置為(-0.06)和(+0.06);單 擊【OK】,完成設置。
示波器時間顯示范圍的修改:單擊示波器的參數設置圖標“
”,引出示波器參數設置窗;
在General卡片的Axes區的Time range欄中,填寫5或auto;單擊【OK】,完成設置。
圖7.10 對顯示屏的縱坐標范圍進行設置
7.11 對示波器時間顯示范圍的設置
·仿真終止時間最簡捷的修改方法:在exam070101模型窗“仿真終止時 間”欄“
”中的默認值10改變為5。
《計算機仿真及應用》實驗教案
·顯示曲線的光滑化設置:選中exam070101模型窗的下拉菜單項SimulationConfiguration Parameters,引出仿真參數配置窗,如圖7.12所示;再在該窗左側的選擇欄中,選中Data Import/Export項,與之相應的參數設置欄便出現在窗口的右側;把右半窗下方Save options 區中Refine factor欄中的默認值1改為5;單擊OK,完成設置。
7.12 通過仿真參數配置窗設置輸出光滑因子
《計算機仿真及應用》實驗教案
完成以上修改后的模型窗如圖7.13所示。再運行exam070101,可得比較滿意的位移變化曲線(見圖7.14所示)。順便指出:模型運行后,在模塊輸出口的信號線上會出現double字樣。這 表示該信號是采用“雙精度”類型數據運算。如果用戶不希望這類標識出現,那么應取消對下 拉菜單項FormatPort signal DisplaysPort Data Types的勾選。
圖7.13
仿真參數調整運行后的exam070101模型
在模型窗中,x’’,x’,x等信號名稱是模型創建者根據需要寫入的。標識信號名稱的操作方法 是:用鼠標雙擊信號附近的適當位置后,就會出現一個虛線框,該虛線框中允許輸入任何 文字。
13、仿真結果顯示
原本比較稀疏的解計算器數據,經設定的“光滑因子”下的插值,增加了用于描繪曲線的 數據點數,因此使示波器顯示出更為光滑的曲線,如圖7.14所示。
《計算機仿真及應用》實驗教案
圖7.14 適當地顯示仿真所得的位移變化曲線
五、實驗小結