第一篇:電子電路上機報告三-差動放大器分析與設計
電子電路上機實驗報告
班級: 學號: 姓名: 實驗三 差動放大器分析與設計
一、電路設計
二、直流工作點分析
由Multisim7仿真結果如下:(1)直流工作點:
V5=-656.58368mv;V6=9.75915v;V9=-9.92162mv 因此有:UC=9.759V UB=-0.0099V UE=-0.6596V 由于發射結正偏,集電結反偏,由此可以判斷三極管處在放大區。
三、測量電流源供給差放的靜態工作電流
在鏡像電流源輸出端串接一個萬用表來測量靜態工作電流的值
測得:I=4.502mA
四、輸入輸出電阻測量
輸入電阻:測量方法為伏安法,方案見下圖
Ri=Ui/Ii=11.12kΩ
輸出電阻:將輸入電壓源短路,同時在輸出端串接電壓源,然后如圖所示分別測量電壓電流
Ro=Uo/Io=1.95kΩ
五、測單端差模放大倍數
儀表連接如下圖:
分別測量輸入和輸出交流電壓,可知Av=-1.83*1000/91.872=-19.9
五、利用波特儀測幅頻相頻特性
(一)幅頻特性測定 雙端:
單端:
(二)相頻特性測定 雙端:
單端:
六、交流分析測幅頻與相頻特性:
七、利用溫度掃描功能給出工作溫度從0攝氏度到100攝氏度變化時,輸出波形的變化
測量結果如下圖所示:
八、設計如下電路,利用溫度掃描功能給出工作溫度從0攝氏度到100攝氏度變化時,輸出波形的變化
選擇溫度掃描分析,得到曲線如下圖:
由七和八中兩電路溫度特性的對比,可以得出結論:差放電路具有強烈的抑制溫度漂移的優點。
九、測量以下電路差模放大倍數
測得:Av=-595.361/8.729=-68.2
十、仿真實驗心得體會
了解到了差動放大器器的特性,對以后的電路設計有很大幫助;
進一步熟悉了Multisim的電路分析功能。
第二篇:電力電子電路建模與分析大作業
XX大學
研究生課程論文/研究報告
課程名稱:電力電子系統建模與分析
任課教師:
完成日期:
2016
年
X
月
X
日
專
業:
電力電子與電力傳動
學
號:
姓
名:
同組成員:
成績:
題目要求
某用戶需要一直流電源,要求:直流輸出24V/200W,輸出電壓波動及紋波均<1%。用戶有220V交流電網(±10%波動變化)可供使用:
(1)
設計電源主電路及其參數;
(2)
建立電路數學模型,獲得開關變換器傳函模型;
(3)
設計控制器參數,給出控制補償器前和補償后開環傳遞函數波特圖,分
析系統的動態和穩態性能;
(4)
根據設計的控制補償器參數進行電路仿真,實現電源要求;
(5)
討論建模中忽略或近似因素對數學模型的影響,得出適應性結論(量化
性結論:如具體開關頻率、具體允許擾動幅值及頻率等)。
主要工作
本次設計主要負責電源主電路及其參數的的設計,以及建立電路數學模型并獲得開關變換器傳函模型這兩部分內容,具體如下:
(1)
本次設計電源主電路及其參數,采用從后向前的逆向設計思想。首先根據系統輸出要求,設計了后級DC/DC型Buck電路的參數。接著設計了前級不控整流電路以及工頻變壓器的參數。考慮到主電路啟動運行時的安全性,在主電路中加入了軟啟動電路;
(2)
本次DC/DC變換器的建模并沒有采用傳統的狀態空間平均方法,而是采用更為簡單、直觀的平均開關建模方法,建立了Buck變換器小信號交流模型。最后,推到出了開關變換器的傳遞函數模型,并給出了Buck電路閉環控制框圖。
設計主電路及其參數
1.1主電路設計
根據題目要求,系統為單相交流220V/50Hz輸入,直流24V/200W輸出。對于小功率單相交流輸入的場合,由于二極管不控整流電路簡單,可靠性高,產生的高次諧波較少,廣泛應用于不間斷電源(UPS)、開關電源等場合。所以初步確定本系統主電路拓撲為:前級AC-DC電路為電源經變壓器降壓后的二極管不控整流,后級DC-DC電路為Buck斬波電路,其中Buck電路工作在電感電流連續模式(CCM),前后級之間通過直流母線和直流電容連接在一起。系統主電路結構如圖1-1所示。
圖1-1
系統主電路結構圖
1.2主電路參數設計
本次設計電源主電路參數,采用從后向前的逆向設計思想。先對后級DC/DC型Buck電路的參數進行設計,接著對前級不控整流電路以及工頻變壓器的參數進行設計。下面分別對后級的Buck電路和前級經變壓器降壓后的不控整流電路各參數進行分析設計。
1.2.1
輸出電阻計算
根據系統電路參數:,可計算:
輸出電流:
(1-1)
負載等值電阻:
(1-2)
1.2.2
BUCK電路占空比及開關頻率選擇
根據Buck電路占空比計算公式:
假定占空比,可得:
(1-3)
由于開關頻率越低,低頻擾動頻率的選擇范圍越小,濾波電感的體積越大,整體裝置的體積和重量越大。開關頻率高,可以用更小的電感來濾除高次諧波,但是開關頻率過高會導致開關管功耗變大,發熱量顯著增加,電路效率變低,散熱器體積也更大。因此要折中效率、體積選擇開關頻率,本次設計選擇MOSFET開關頻率。
1.2.3
BUCK電路濾波電感選擇
由BUCK電路電感電流連續的臨界條件:
可得要保證電路工作在CCM模式下,則電感應滿足:
(1-4)
根據開關頻率,則
(1-5)
假定電感紋波電流為輸出負載電流額定值的30%,此時電感值應為:
(1-6)
保留一定余量,本系統實取。
1.2.4
BUCK電路濾波電容選擇
電容容值越大,輸出電壓將近似為恒定,但電容越大,裝置體積和成本也相應增大,因此本系統根據輸出電壓的紋波要求選取電容。本設計按輸出電壓紋波不超過輸出電壓的1%進行計算:
(1-7)
保留一定余量,本系統實取。
1.2.5
開關管MOSFET選擇
開關導通時MOSFET端電壓近似為0V,開關關斷時MOSFET承受最大電壓為:
(1-8)
一個開關周期內流過開關管的電流最大值等于電感電流最大值,即:
(1-9)
綜上,考慮裕量,選擇MOSFET的型號為IRF650A,其額定參數為。
1.2.6
整流后直流側電容選擇
直流母線電壓通過單相橋式整流而來故每個周期發生2次脈動,單相工頻電壓的周期為T=0.02s,在T/2周期內電容完成一個充電和放電的周期。直流側電容的選擇依據有:
(1)
有依電流為依據的,例如:每0.5A電流1000uF
(2)
有依RC時間常數為依據的,例如:單相不控整流電路
其中,T為交流電源周期
則:
(1-10)
(3)還有一種經驗數據:
負載電流(A)
2A
1A
0.5-1A 0.1-0.5A
<0.1A?。?.05A
濾波電容(μF)4000
2000
1000
500
200-500 200
根據直流側電壓平均值為48V,則直流側的等效電流約為,由經驗數據可大概估算直流側電容為10000uF。本系統實際選擇100V/100uF
CL20型金屬化聚脂膜電容器,采用10只并聯。
1.2.7
整流二極管選擇
(1)確定整流二極管的耐壓值
根據全橋整流電路中每個二極管所承受的反向電壓:
可得整流二極管耐壓值為:
(1-11)
其中,為整流橋輸入電壓有效值,1.1為電壓波動系數,為安全系數。
則二極管耐壓值為:
(1-12)
(2)確定整流二極管的額定電流值
流過每個二極管的平均電流為直流側電流的一半,取電流波動系數取1.1,安全系數,則整流二極管額定電流值為:
(1-13)
根據上述參數選擇二極管型號為P600D,查其參數手冊可知二極管的通態壓降為,則每個二極管額通態損耗為:
(1-14)
1.2.8
變壓器選擇
電壓比:
變壓器電壓比的計算原則是電路在最大占空比和最低輸入電壓的條件下,輸出電壓能達到要求的上限。根據公式:
其中,為二極管整流橋輸出電壓最小值;為最大占空比,取0.9;為
考慮管壓降和線壓降,取2V;為最高輸出電壓。
實際根據單相二極管不控整流電路的輸入輸出關系,可得不控整流的輸入側電壓,即變壓器二次側電壓為:
(1-15)
則變壓器電壓比為:
(1-16)
容量:
根據系統輸出功率,考慮電路損耗及效率,變壓器容量選擇為300VA。
鐵芯截面積:
鐵芯截面積是根據變壓器總功率P確定的,根據變壓器次級功率為P2=200W。計算變壓器輸入功率P1(考慮變壓器效率η=0.9)P1=P2/0.9=222.2w。
則鐵芯截面積為:
(1-17)
匝數:
變壓器匝數的選擇(工頻變壓器)
根據變壓器最高輸出電壓,電源周期,鐵心截面積,鐵心材料所允許的最大磁通密度的變化量,則變壓器二次側繞組匝數為:
(1-18)
則變壓器一次側繞組匝數:
(1-19)
繞組導體截面:
根據流過每個繞組的電流值和預先選定的電流密度,即可計算出繞組導體截面:
(1-20)
其中,導體電流密度選。
1.2.9
主電路軟啟動設計
由于二極管不控整流后直流側電容上的初始電壓為零,在輸入電路合閘的瞬間,會形成很大的瞬時沖擊電流,主電路軟啟動電路不僅可以防止合閘時電路受到浪涌電流的沖擊,它還能使電路緩慢的啟動,減小了變換器和輸出電容上的電流最大值,軟啟動電路性能的好壞,會直接影響到電源的工作性能,元器件的壽命,所以很重要。常用的軟啟動有:采用功率熱敏電阻電路、采用SCR、R電路、繼電器與電阻構成的回路、采用定時觸發器的繼電器與限流電阻的電路等等。根據系統實際的需要為了避免系統啟動可能引起系統內浪涌問題,采用加入軟啟動環節進行處理,如下圖1-2所示。先通過電阻R對輸入濾波環節的濾波電容進行預充電,充電完成后接入時間繼電器KT使電阻R短路。加入了軟啟動環節后,避免了瞬時大電壓及大電流的沖擊,保證了系統工作安全及元器件安全。
圖1-2
軟啟動電路結構圖
建立電路數學模型,獲得開關變換器傳函模型
由于狀態空間平均方法建模純粹基于數學,計算推導比較繁瑣、模型不直觀。而平均開關建模方法,是直接通過電路變換得到電力電子電路小信號交流模型,更直觀、使用更方便,所以本次DC/DC變換器建模采用平均開關方法建模。
2.1建立電路數學模型
任一DC/DC變換器可分割成兩個子電路,一個子電路為線性定常子電路,另一個為開關網絡子電路。線性定常子電路無需進行處理,關鍵是通過電路變換將非線性的開關網絡子電路變換成線性定常電路。如圖2-1所示,為Buck變換器電路。圖2-2給出了Buck變換器的開關網絡子電路,開關網絡子電路用二端口網絡表示,端口變量為。
圖2-1
Buck變換器電路
圖2-2
Buck變換器開關網絡子電路
根據開關管導通時,開關管關斷時。將上述開關網絡子電路用受控源替代,如圖2-3所示。且替代后,受控源網絡端口與開關網絡子電路端口的電量波形應保持一致。將替代后的開關網絡的受控源電路與原來的線性定常子電路組合一起,得到含有受控源的等效Buck電路如圖2-4所示。
圖2-3
受控源替代開關網絡子電路
圖2-4
受控源替代開關網絡的Buck電路
應用開關周期平均的概念,對圖2-4等效電路中的各個電量作開關周期平均運算:
(2-1)
得到以開關周期平均值表示的等效電路如圖2-5所示,該電路仍是一個非線性電路。
圖2-5
經開關周期變換后的Buck變換器
采用擾動法,對上述等效電路中的各個電量引入小信號擾動,即令:
(2-2)
得到有小信號擾動作用的等效電路如圖2-6所示。
圖2-6
小信號擾動的Buck電路
其中:
(2-3)
將圖2-6等效電路各個電量中含有的二次項忽略(主要是受控源電量)
:
(2-4)
得到線性近似、受控源表示的小信號等效電路如圖2-7所示。
圖2-7
忽略二次項影響的小信號擾動的Buck電路
進一步用理想變壓器替代受控源,得到線性近似、理想變壓器表示的小信號等效電路如圖2-8所示。
圖2-8
用理想變壓器表示的小信號等效Buck電路
2.2開關變換器傳遞函數模型
由上述建立的Buck電路小信號交流平均開關模型可推出變換器的傳遞函數為:
輸入至輸出的傳遞函數:
(2-5)
控制至輸出的傳遞函數:
(2-6)
Buck電路閉環控制框圖如圖2-9所示。
圖2-9
Buck電路閉環控制框圖
其中:
(1)
為需要設計的控制器;
(2)
為PWM調制器傳遞函數;
(3)
為輸出電壓對占空比的傳遞函數;
(4)
為反饋環節的傳遞函數。
設計中取,將計算數值帶入閉環控制框圖,可得本系統Buck電路閉環控制框圖如圖2-10所示。
圖2-10本系統
Buck電路閉環控制框圖
其中原始回路增益為:
(2-7)
設計控制器參數
沒有加控制器補償前變換器原始回路增益函數:
(3-1)
其伯德圖如圖3-1所示。
圖3-1
原始回路增益伯德圖
利用超前—滯后補償網絡來校正系統,設計的補償網絡的傳遞函數為:
(3-2)
相應的補償網絡的伯德圖如圖3-2所示。
圖3-2
補償網絡伯德圖
補償后系統開環傳遞函數伯德圖如圖3-3所示。
圖3-3
補償后系統伯德圖
由圖可以看出此時系統的相位余量為67.5°,幅值余量為20.3dB。
電路仿真
根據以上設計的主電路以及控制器參數,在PSIM中搭建仿真電路,并進行仿真驗證,仿真模型以及仿真結果如下所示:
圖4-1
主電路仿真模型
圖4-2
控制電路仿真模型
系統輸出電壓Uo與輸出電流Io的波形如圖4-3和4-5所示。
圖4-3
輸出電壓波形圖
圖4-4
輸出電壓有效值
圖4-5
輸出電流波形圖
圖4-6
輸出電壓局部放大圖
由圖4-6可知,輸出電壓穩態值為24V,波動約為0.02%<1%,滿足設計要求,超調量為12.5%,調節時間大約為3ms。
圖4-7
突加100%負載輸出電壓波形圖
由圖4-7可知,在0.04s時加入100%的負載擾動,輸出電壓依然穩定在24V,且滿足1%的紋波設計要求。
圖4-8
輸出電路電壓、電流波形圖
圖4-9
輸出電路電壓、電流有效值
由圖4-9中輸出電壓、電流有效值計算,輸出功率約為P=U*I=24*8.3=199.2W,輸出功率基本滿足設計要求。
建模中忽略或近似因素對數學模型的影響
(1)開關頻率對電路模型的影響
開關頻率越低,低頻擾動頻率的選擇范圍越小,濾波電感的體積越大,整體裝置的體積和重量越大。開關頻率高,可以用更小的電感來濾除高次諧波,但是開關頻率過高會導致開關管功耗變大,發熱量顯著增加,電路效率變低,散熱器體積也更大,更加因此要折中效率、面積選擇開關頻率。
電路模型的開關頻率越大,輸出結果越接近數學模型,一般開關頻率可以取截止頻率的100倍。
(2)擾動頻率對數學模型的影響
擾動頻率過高:如果高于開關頻率,由于一般使用正弦信號模擬擾動,在一個開關周期內擾動信號正負分量相互抵消,小信號擾動失去意義。
擾動頻率過低:如果擾動頻率過低,在多個開關周期內擾動信號基本為恒定值,相當在給定電壓上疊加了一個幾乎不變的直流量,不能很好地體現其為小信號“動態”模型。
綜上,擾動頻率的選擇應在一個合適的范圍內,這樣既可以方便地對電路進行分析和控制,又不失動態建模的意義。
(3)擾動幅度的影響
小信號擾動的幅值應遠小于穩態工作點的各量的幅值。根據仿真結果可得隨著擾動幅度增大,數學模型的輸出電壓變化幅度較小。擾動幅值不超過±5V時,輸出電壓紋波仍滿足1%的設計要求。
(4)其他影響
實際電路中存在電感的等效電阻、開關管的開通關斷時間、管壓降等都會對電路模型的輸出產生影響,這些量的大小也會影響小信號建模的準確性和適用性。
參考文獻
[1]
裴云慶,等.開關穩壓電源的設計和應用[M].北京:機械工業出版社,2010.[2]
王兆安,等.電力電子技術[M].5版.北京:機械工業出版社,2009.[3]
林渭勛.現代電力電子技術[M].北京:機械工業出版社,2006.[4]
張崇巍.PWM整流器及其控制[M].北京:機械工業出版社,2003.[5]
徐德鴻.電力電子系統建模及控制[M].北京:機械工業出版社,2006.[6]
張占松
蔡宣三.開關電源的原理與設計(修訂版)[M].電子工業出版社,2006.
第三篇:電子電路CAD設計實驗報告一、二、三
實驗項目一:Altium Designer 10.0軟件的安裝以及熟悉軟
件開發環境
一、實驗目的:
1.體會Altium Designer 10.0的基本操作,熟悉各元器件的應用技巧。2.學會繪制電路原理圖的基本步驟以及方法與技巧。3.掌握原理圖元件的屬性設置
二、實驗儀器:
計算機、Altium Designer軟件
三、實驗學時:4學時
四、實驗的主要步驟:
一、創建原理圖設計文件
1)創建項目文件。執行選單命令“FileNewPCB Project”。
2)通過“另存為”命令將創建的項目文件重命名。執行選單命令“FileNew Save Project”或“FileNewSave Project As”。
3)創建原理圖編輯文件。執行選單命令FileNewSchematic。4)執行選單命令FileSave。
二、設置圖樣參數
在原理圖設計窗口單擊右鍵,屏幕上出現快捷選單,單擊“Document Options…”,出現“文件選項”對話框。在“Standard ”欄選擇右邊的選項,將默認的圖樣幅面“B”改為“A4”
三、載入元件庫
四、放置元件
單擊“Wiring” 工具欄內的放置元件
按鈕,會出現“Place Part”對話框。也可在選單欄單擊“PlacePart…”;還可以在原理圖設計畫面上單擊鼠標右鍵,在出現的快捷選單中選擇“Place Part…”
五、編輯元件屬性
雙擊要編輯的元件符號,會彈出元件屬性“Component Properties”對話框。
六、放置電源和接地符號
執行選單命令Place Power Port命令,光標變為十字狀,并拖有一個電源或地符號,按下Tab鍵,彈出的“Power Port”對話框進行編輯設置。
七、放置連線和節點
執行選單命令Place wire和PlaceJunction,也可按工具欄中的按鈕操作。
八、放置網絡標號
單擊“Wiring”工具欄內的放置網絡標號
按鈕,光標變為十字狀,并拖著一個網絡標號字符串,按下鍵盤上的Tab按鈕,在彈出的“Net Label”對話框中進行修改,然后單擊“OK”按鈕,再將光標移到要放置網絡標號的的導線上,單擊鼠標左鍵即可定位,從而完成電路一個網絡標號的放置。
九、畫圖案和放置文字可單擊實用工具欄下拉“Drawing”命令中單擊
按鈕,光標變成十字狀,并在其右上角有一個虛框,這時再按下Tab鍵,在對話框“Text”欄中填入文字“ZDQ.SCHDOC”,通過編輯文字對話框“Font”欄中“Change…”可以改變編輯文字的字體和大小。將光標移到合適的位置單擊左鍵,完成文字放置,然后單擊右鍵退出放置圖形狀態。
五、實驗結果:
六、實驗心得:
實驗過程中,有一些電路元器件不知道在哪里找,這是因為對Altium Designer軟件不熟練所致,只有熟練掌握軟件操作才能流暢地完成實驗。另外注意保存的文件名稱。
實驗項目二:繪制原理圖及原理圖元件
一、實驗目的:
1.了解自頂向下的設計方法。2.掌握繪制層次原理圖的方法和流程
二、實驗儀器:
計算機、Altium Designer軟件
三、實驗學時:6學時
四、實驗的主要步驟:
1.根據新建工程文件的方法,新建工程文件,并在指定目錄下保存為“本人名字-實驗.PrjPCB”;在該工程文件中新建原理圖文件,.SchDoc”。
2.從菜單選擇Design → Document Options,在此唯一需要修改的是將圖紙大?。╯heet size)設置為標準A4格式。
3.下面將介紹從默認的安裝庫中首先放置兩個三極管Q1和Q2。
(1)從菜單選擇View → Fit Document(熱鍵V、D)確認設計者的原理圖紙顯示在整個窗口中。
(2)單擊Libraries標簽以顯示Libraries面板。
(3)Q1和Q2是型號為NPN的三極管,該三極管放在Miscellaneous Devices.IntLib集成庫內,所以從Libraries面板“安裝的庫名”欄內,從庫下拉列表中選擇Miscellaneous Devices.IntLib來激活這個庫。
(4)使用過濾器快速定位設計者需要的元件。默認通配符(*)可以列出所有能在庫中找到的元件。在庫名下的過濾器欄內鍵入c*設置過濾器,將會列出所有包含“c”的元件。
4.在列表中單擊NPN以選擇它,然后單擊Place按鈕。另外,還可以雙擊元件名。光標將變成十字狀,并且在光標上“懸浮”著一個三極管的輪廓。現在設計者處于元件放置狀態,如果設計者移動光標,三極管輪廓也會隨之移動。
5.在原理圖上放置元件之前,首先要編輯其屬性。在三極管懸浮在光標上時,按下TAB鍵,這將打開Component Properties(元件屬性)對話框,現在要設置對話框
選項如圖2-9所示。
6.在對話框Properties單元,在Designator欄中鍵入Q1以將其值作為第一個元件序號。
7.設計者創建元件之前,需要創建一個新的原理圖庫來保存設計內容。這個新創建的原理圖庫可以是分立的庫,與之關聯的模型文件也是分立的。另一種方法是創建一個可被用來結合相關的庫文件編譯生成集成庫的原理圖庫。使用該方法需要先建立一個庫文件包,庫文件包(.LibPkg文件)是集成庫文件的基礎,它將生成集成庫所需的那些分立的原理圖庫、封裝庫和模型文件有機地結合在一起。
8.執行 File → New → Project → Integrated 新建的庫文件包,默認名為Integrated_Libraryl.LibPkg。
9.在Projects面板上右擊庫文件包名,在彈出菜單上單擊Save Project As命令,在彈出的對話框中使用瀏覽功能選定適當的路徑,然后輸人名稱New Integrated_ Library1.LibPkg,單擊Save按鈕。注意如果不輸人后綴名的話,系統會自動添加默認名。
10.添加空白原理圖庫文件。執行File → New → Library → Schematic Library命令,Projects面板將顯示新建的原理圖庫文件,默認名為Schlibl.SchLib。自動進入電路圖新元件的編輯界面,如圖:
11.設計者可在一個已打開的庫中執行Tools→New Component命令新建一個原理圖元件。由于新建的庫文件中通常已包含一個空的元件,因此一般只需要將Component_1重命名就可開始對第一個元件進行設計,這里以AT89C2051單片機(如圖4-7所示)為例介紹新元件的創建步驟。在原理圖新元件的編輯界面內:
(1)在SCH Library面板上的Components列表中選中Component_1選項,執行Tools→ Rename Component命令,彈出重命名元件對話框輸入一個新的、可唯一標識該元件的名稱,如AT89C2051,并單擊“確定”按鈕。同時顯示一張中心位置有一個巨大十字準線的空元件圖紙以供編輯。
(2)如有必要,執行Edit→Jump→Origin命令(快捷鍵J,O),將設計圖紙的原點定位到設計窗口的中心位置。檢查窗口左下角的狀態欄,確認光標已移動到原點位置。新的元件將在原點周圍上生成,此時可看到在圖紙中心有一個十字準線。設計者應該在原點附近創建新的元件,因為在以后放置該元件時,系統會根據原點附近的電氣熱點定位該元件。
(3)可在“Library Editor Workspace”對話框設置單位、捕獲網格(Snap)和可視網格(Visible)等參數,執行Tools→Document Options命令(快捷鍵T,D),彈出Library Editor Workspace對話框如圖4-3所示。針對當前使用的例子,此處需要圖4-3所示對話框中各項參數。選擇Always Show Comment/Designator復選框,以便在當前文檔中顯示元器件的注釋和標識符。單擊Units標簽,選中Use Imperial Unit System復選框,其它使用默認值,單擊OK按鈕關閉對話框。注意縮小和放大均圍繞光標所在位置進行,所以在縮
放時需保持光標在原點位置。
(4)首先需定義元件主體。在第4象限畫矩形框:1000*1400mil;執行Place→Rectangle命令或單擊“ ”圖標,此時鼠標箭頭變為十字光標,并帶有一個矩形的形狀。在圖紙中移動十字光標到坐標原點(0,0),單擊鼠標左鍵確定矩形的一個頂點,然后繼續移動十字光標到另一位置(100,-140),單擊鼠標左鍵,確定矩形的另一個頂點,這時矩形放置完畢。十字光標仍然帶有矩形的形狀,可以繼續繪制其他矩形。
(5)元件引腳代表了元件的電氣屬性,為元件添加引腳的步驟如下。單擊Place→Pin命令(快捷鍵P,P)或單擊工具欄按鈕“
”,光標處浮現引腳,帶電氣屬性。放置之前,按Tab鍵打開Pin ProPerties對話框,如圖所示。如果設計者在放置引腳之前先設置好各項參數,則放置引腳時,這些參數成為默認參數,連續放置引腳時,引腳的編號和引腳名稱中的數字會自動增加。
五、實驗結果:
六、實驗心得:
在繪制原理圖的過程中要注意元件庫的加載以及元件的查找方法,在缺少所繪原理圖元件時,我們要手動繪制該元件。
實驗項目三: 印制電路板PCB設計
一、實驗目的:
1.熟悉生成印刷電路板的基本步驟和方法 2.了解PCB設計流程、PCB工具欄使用。3.掌握自動布局與自動布線等知識。
二、實驗儀器:
計算機、Altium Designer軟件
三、實驗學時:6學時
四、實驗的主要步驟:
1.打開繪制完成的振蕩器電路原理圖。
2.新建一個PCB文檔,打開PCB編輯器,單擊PCB編輯窗口西方的“Keep-Out Layer”面板標簽,在該層中執行Place/keepout/Track命令或者單擊工具欄中的快捷按鈕,繪制電路板的電氣邊框。
3.加載元器件庫,在PCB編輯窗口內,單擊“Libraries”面板標簽打開元 器件庫,在該面板中單擊左上方的“Libraries”按鈕,添加Miscellaneous Devices PCB元器件庫,然后單擊按鈕Close按鈕即完成PCB元器件庫的加載。
4.在PCB編輯中執行Design/Import Changes From[PCB Project1.PrjPCB]命令并在出現的工程網絡變化對話框中單擊“Validate Changes”按鈕,若狀態欄一列中出現○√說明裝入的元器件正確,再單擊“Execute Changes”按鈕將原理圖加載到PCB編輯器中。
5.執行Tools/Auto Placement/Auto Placer命令,得到自動布線的結果。
6.手動元器件布局調整。執行Edit/Move/move命令,選中要移動的元器件,單擊空格鍵進行旋轉,直至找到自己想要的角度,再單擊鼠標左鍵來放置元器件,手動調整元器件布局的結果。
7.執行Auto Route命令后,在隨后彈出的對話框中選擇默認值,單擊“Route All”按鈕,進行自動布線。布線完畢后,在PCN編輯器中,將顯示如圖5-5所示的自動布線電路版圖。
8.執行View/Board in 3D命令,系統將自動生成一個3D 的效果圖 9.布線規則檢查,完成后保存。
10.新建“.Schlib”的原理圖,繪制原理圖元件庫。產生一個新的封裝庫文件。方法如下:選擇主菜單中的“File”→“New”→“library”→“PCBlibrary”命令,在“.PrjPcb”項目中新建一個名稱為“PCB1.Pcblib”的封裝庫文件。在新建的封裝庫文件上單擊鼠標右鍵,在彈出的下拉菜單中選擇“Save”命令,打開“Save[PCB1.Pcblib]As”對話框。在“Save[PCB1.Pcblib]As”對話框的“文件名”編輯框中輸入“名稱”,單擊“保存”按鈕,將新建的PCB文檔保存為“.Pcblib”文件。
11.在主菜單中選擇“place”→命令,放置元件外形以及焊盤。
五、實驗結果:
六、實驗心得:
實驗過程中,有一些電路元器件不知道在哪里找,這是因為對Altium Designer軟件不熟練所致,只有熟練掌握軟件操作才能流暢地完成實驗。
第四篇:計算方法與實習上機報告
計算方法與實習
——上機報告
學院:電子工程學院
2015.1.4
學號:***
姓名: 劉
波
習題一: 舍入誤差及穩定性
一、實驗目的
(1)通過上機編程,復習鞏固以前所學程序設計語言及上機操作指令;(2)通過上機計算,了解舍入誤差所引起的數值不穩定性
二、實驗內容
?
21、用兩種不同的順序計算?n,分析其誤差的變化
n?1100002、已知連分數f?b0?a1,利用下面的算法計算f:
b1?a2/?b2?a3/(...?an/bn)?ai?
1(i?n?1,n?2,..., 0f?d0 di?1寫一程序,讀入n,b0,b1,...,bn,a1,...,an,計算并打印f dn?bn,di?bi?
3、給出一個有效的算法和一個無效的算法計算積分
xnyn??dx
(n?0,1,..., 104x?1N11?311?
4、設SN??2,已知其精確值為????
2?2NN?1?j?2j?1(1)編制按從大到小的順序計算SN的程序 1(2)編制按從小到大的順序計算SN的程序
(3)按兩種順序分別計算S1000,S10000,S30000,并指出有效位數
三、實驗步驟、程序設計、實驗結果及分析
?
21、用兩種不同的順序計算?n,分析其誤差的變化
n?110000(1)實驗步驟:
分別從1~10000和從10000~1兩種順序進行計算,應包含的頭文件有stdio.h和math.h(2)程序設計: a.順序計算
#include
sum=sum+(1/pow(n,2));
if(n%1000==0)printf(“sun[%d]=%-30f”,n,sum);
if(n>=10000)break;
n++;} printf(“sum[%d]=%fn”,n,sum);} b.逆序計算
#include
while(n!=0){
sum=sum+(1/pow(n,2));
if(n%200==0)
printf(“sum[%d]=%-10f”,n,sum);
if(n<1)break;
n--;} printf(“sum[%d]=%fn”,n,sum);}
(3)實驗結果及分析: 程序運行結果: a.順序計算
b.逆序計算
結果分析:兩種不同順序計算結果是一樣的,順序計算誤差從一開始就很小,而逆序計算誤差最開始十分大,后來結果正確。
2、已知連分數f?b0?(1)實驗步驟: 利用 dn?bn,di?bi?a1,計算f:
b1?a2/?b2?a3/(...?an/bn)?ai?1,0
(i?n?1,n?2,...,f?d0,計算f
di?1(2)程序設計 #include
printf(“nplease input a[0] to a[n-1]:n”);for(i=1;i printf(“a[%d]=”,i); scanf(“%f”,&a[i]);} printf(“nplease input b[0] to b[n-1]:n”);for(i=0;i printf(“b[%d]=”,i); scanf(“%f”,&b[i]);} d[n]=b[n];for(i=n-1;i>=0;i--) c[i]=b[i]+a[i+1]/c[i+1];printf(“nf=%fn”,c[0]);}(3)實驗結果 程序運行結果: 3、給出一個有效的算法和一個無效的算法計算積分 xnyn??dx (n?0,1,..., 104x?11(1)實驗步驟 利用C語言編寫程序,分別使用數值穩定的和數值不穩定的計算公式所建立的遞推公式進行計算。 (2)程序設計 #include y_1=1.0/(4*n)+y_0/(-4.0); printf(“y[%d]=%-20f”,n,y_1); if(n>=10)break; y_0=y_1; n++; if(n%3==0)printf(“n”);} printf(“n無效算法的輸出結果:n”);printf(“y[10]=%-20f”,y_2);while(1){ y_3=1.0/n-4.0*y_2; printf(“y[%d]=%-20f”,m-1,y_3); if(m<=1)break; y_2=y_3; m--; if(m%2==0)printf(“n”);} }(3)實驗結果及分析 程序運行結果: 結果分析:無效算法數值不穩定,誤差造成的影響特別大 4、設SN? ?j?2N11?311?,已知其精確值為???? 2?2NN?1?j2?1(1)實驗步驟 先編程按從大到小的順序計算SN的程序,再編程按從小到大的順序計算SN的程序,然后按兩種順序分別計算S1000,S10000,S30000。(2)程序設計 #include int N;double SN[30000];SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0; for(N=30000;N>=2;N--) SN[N-1]=SN[N]-1.0/(N*N-1);printf(“從大到小順序計算nSN[1000]=%fnSN[10000]=%fnSN[30000]=%fn”,SN[1000],SN[10000],SN[30000]); SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0;for(N=3;N<=30000;N++) SN[N]=SN[N-1]+1.0/(N*N-1);printf(“從小到大順序計算nSN[1000]=%fnSN[10000]=%fnSN[30000]=%fn”,SN[1000],SN[10000],SN[30000]);}(3)實驗結果及分析 程序運行結果: : : 結果分析:不同順序計算所得結果是一樣的。 四、總結 通過這次上機,學習了解了舍入誤差在不同算法時對結果的影響不同,穩定的算法才能獲得正確的結果。 習題二: 一、實驗目的 (1)通過對二分法與牛頓迭代法做編程練習和上機運算,進一步體會二分法和牛頓法的不同。 (2)編寫割線迭代法的程序,求非線性方程的解,并與牛頓迭代法作比較。 二、實驗內容 1、用牛頓法求下列方程的根(1)x?e?0 (2)xe?1?0(3)lgx?x?2?0 2、編寫割線法程序求解第一問的方程 三、實驗步驟、程序設計、實驗結果及分析 1、牛頓法(1)實驗步驟 通過定義牛頓法求方程的子函數,用main函數調用子函數求根(2)程序設計 #include float ff1(float x){ return x*x-exp(x);} x2xfloat ff2(float x){ return x*exp(x)-1;} float ff3(float x){ return log(x)+x-2;} float answer(float(*p)(float)){ int k=2; float m=1,n=-1,x2,a,b,c; if(p==ff3)n=2; printf(“x[0] = %.4f, x[1] = %.4f, ”,m,n); while(1) { if(fabs(m-n)<1e-4)break; a=p(n)*(n-m); b=p(n)-p(m); c=a/b; x2=n-c; m = n; n = x2; printf(“x[%d] = %.4f, ”,k,x2); k++; if(k%3==0)printf(“n”); } if(k%3!=0)printf(“n”); printf(“iteration times: %d, roots: %.4fn ”,k-2,n);return 0;} main(){ printf(“x*x-exp(x),n”);answer(ff1);printf(“x*exp(x)-1,n”);answer(ff2);printf(“lg(x)+x-2,n”);answer(ff3);return 0;}(3)實驗結果及分析 2、割線法(1)程序設計 #include int i,j; float x1=2.2; float x2=2,x3; scanf(“%d”,&i); if(i==1)printf(“%f”,x1); else if(i==2)printf(“%f”,x2); else { for(j=3;j<=i;j++) { x3=gexian(x1,x2); x1=x2; x2=x3; } printf(“%f”,gexian(x1,x2)); } } float f(float x){ return(x*x-exp(x));} float gexian(float x1,float x2){ return(x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1));}(3)實驗結果及分析 四、總結 了解和學習了二分法和牛頓迭代法的思想以及程序設計的方法,比較了迭代法和牛頓法的特點:牛頓法收斂速度較快,但對初值選取要求較高;割線法計算量少。 習題三: 線性方程組數值解法 一、實驗目的 (1)熟悉求解線性方程組的有關理論和方法; (2)會編制列主元消去法,LU分解法,雅可比及高斯-賽德爾迭代法的程序;(3)通過實際計算,進一步了解各種方法的優缺點,選擇合適的數值方法。 二、實驗內容 1、用列主元消去法解方程組 2、用LU分解法解方程組 三、實驗步驟、程序設計、實驗結果及分析 1、用列主元消去法解方程組(1)程序設計 #include k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++) *(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } void main(){ int i;float x[4];float c[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4}; ColPivot(c[0],4,x);for(i=0;i<=3;i++) printf(“x[%d]=%fn”,i,x[i]);}(2)實驗結果及分析 (1)題 (2)題 2、用LU分解法解方程組(1)程序設計 #include for(i=r;r<=n;i++) for(k=0;k<=r-1;k++) *(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i)); for(i=r+1;i<=n-1;i++) { for(k=0;k<=r-1;k++) *(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r)); *(u+i*(n+1)+r)/=*(u+r*(n+1)+r); } } for(i=n-1;i>=0;i--){ for(r=n-1;r>=i+1;r--) *(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r]; x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));} } 四、總結 掌握了用列主元消去法和LU分解法求解方程組程序編寫的技巧。 習題四: 插值法 一、實驗目的 (1)熟悉拉格朗日插值法多項式和牛頓插值多項式,注意其不同點;(2)掌握三次樣條插值解決一些實際問題。 二、實驗內容 1、按所給數據做二次插值,并求給定點的函數值 2、按所給數據做五次插值,并求給定點的函數值 3、牛頓前插公式計算函數值 三、實驗步驟、程序設計、實驗結果及分析 1、二次插值(1)程序設計 #include //n為(n+1)次插值; { int i,j;float *a,yy=0; a=new float[n];for(i=0;i<=n-1;i++){ a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i];} delete a;return yy;} void main(){ float x[5]={-3.0,-1.0,1.0,2.0,3.0};float y[5]={1.0,1.5,2.0,2.0,1.0};float xx1=-2,xx2=0,xx3=2.75,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,3);yy2=Lagrange(x,y,xx2,3);yy3=Lagrange(x,y,xx3,3);printf(“x1=%-20f,y1=%fn”,xx1,yy1);printf(“x2=%-20f,y2=%fn”,xx2,yy2);printf(“x3=%-20f,y3=%fn”,xx3,yy3);}(2)實驗結果 2、五次插值(1)程序設計 #include //n為(n+1)次插值; { int i,j;float *a,yy=0; a=new float[n];for(i=0;i<=n-1;i++){ a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i];} delete a;return yy;} void main(){ float x[6]={0.30,0.42,0.50,0.58,0.66,0.72};float y[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};float xx1=0.46,xx2=0.55,xx3=0.60,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,6);yy2=Lagrange(x,y,xx2,6); yy3=Lagrange(x,y,xx3,6);printf(“x1=%-20f,y1=%fn”,xx1,yy1);printf(“x2=%-20f,y2=%fn”,xx2,yy2);printf(“x3=%-20f,y3=%fn”,xx3,yy3);} (2)實驗結果 3、牛頓前插公式計算函數值(1)程序設計 #include int k,i;f[0][0]=y[0];f[1][0]=y[1];f[2][0]=y[2];f[3][0]=y[3];for(k=1;k<=n;k++) for(i=0;i<=(N-k);i++) f[i][k]=f[i+1][k-1]-f[i][k-1];return;} void main(){ int i,k=1;float a,b=1,m=21.4,t=1.4,f[4][4]={0};float x[5]={20,21,22,23,24};float y[5]={1.30103,1.32222,1.34242,1.36173,1.38021};Difference(y,f,N);a=f[0][0];for(i=1;i<=N;i++){ k=k*i; b=b*(t-i+1); a=a+b*f[0][i]/k;} printf(“x(k)n”);for(i=0;i<=4;i++) printf(“%-20f”,x[i]);printf(“ny(k)n”); for(i=0;i<=4;i++) printf(“%-20f”,y[i]);for(k=1;k<=3;k++){ printf(“nF(%d)n ”,k); for(i=0;i<=(3-k);i++) { printf(“%-20f”,f[i][k]); } } printf(“n”);printf(“f(%f)=%-20f”,m,a);printf(“n”);}(2)實驗結果 四、總結 學習了插值法,學會了利用插值法編程求多項式的解,可以求解很多問題,讓求解多項式解變得非常簡單。 習題五: 曲線擬合 一、實驗目的 (1)了解最小二乘法的基本原理,通過計算機解決實際問題;(2)了解超定方程組的最小二乘解法。 二、實驗內容 1、分別用拋物線y?a?bx?cx2和指數曲線y?aebx擬合所給數據,并比較這兩個擬合函數的優劣。 2、按所給實驗數據,用形如y?a?bx的拋物線進行最小二乘擬合。 三、程序設計、結果分析 1、分別用拋物線y?a?bx?cx和指數曲線y?ae擬合所給數據 a.拋物線 (1)程序設計: #include 2bx2 float y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325.15};void Approx(float[],float[],int,int,float[]);Approx(x,y,15,2,a);for(i=0;i<=2;i++) printf(“a[%d]=%fn”,i,a[i]);} void Approx(float x[],float y[],int m,int n,float a[]){ int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){ for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0; for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);} ColPivot(c,n+1,a);delete c;} void ColPivot(float *c,int n,float x[]){ int i,j,t,k;float p;for(i=0;i<=n-2;i++){ k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } float power(int i,float v){ float a=1;while(i--)a*=v;return a;}(2)實驗結果 2、最小二乘擬合(1)程序設計 #include //增加了數組z; {z[n]=log(y[n]/x[n]);} void Approx(float[],float[],int,int,float[]);Approx(x,z,15,1,a); //變成一次擬合; //for(i=0;i<=1;i++) //printf(“a[%d]=%fn”,i,a[i]);printf(“a=exp(a[0])=%fn”,exp(a[0]));printf(“b=-a[1]=%fn”,-a[1]);} void Approx(float x[],float y[],int m,int n,float a[]){ int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){ for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0; for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);} ColPivot(c,n+1,a);delete c;} void ColPivot(float *c,int n,float x[]){ int i,j,t,k;float p;for(i=0;i<=n-2;i++){ k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } float power(int i,float v){ float a=1;while(i--)a*=v;return a;}(2)實驗結果 四、總結 通過曲線擬合,最小二乘法的基本原理的學習,我學會了利用計算機解決現實實際問題中的曲線擬合。 習題六: 數值積分 一、實驗目的 (1)通過實際計算體會各種方法的精確度;(2)會編寫用龍貝格算法求定積分的程序。 二、實驗內容 編寫復化柯特斯求積分公式,并計算例題1例題2,觀察n為多少時有6位有效數字。 三、程序設計、實驗結果及分析(1)程序設計 #include c1+=(*f)(a+k*h); c2+=(*f)(a+k*h+h/4); c3+=(*f)(a+k*h+h/2); c4+=(*f)(a+k*h+3*h/4);} c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;} float f(float x){ return 1/sqrt(1+x*x*x);} void main(){ int i,n=4;float c;for(i=0;i<=4;i++){ c=Cotes(f,0,1,n); printf(“C(%d)=%fn”,n,c); n*=2;} } #include c1+=(*f)(a+k*h); c2+=(*f)(a+k*h+h/4); c3+=(*f)(a+k*h+h/2); c4+=(*f)(a+k*h+3*h/4);} c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;} float f(float x){ // return 1/sqrt(1+x*x*x); if(x==0)return 1; else return sin(x)/x;} void main(){ int i,n=4;float c;for(i=0;i<=4;i++){ // c=Cotes(f,0,1,n); c=Cotes(f,0,5,n); printf(“C(%d)=%fn”,n,c); n*=2;} } (2)實驗結果及分析 四、總結 學習了復化辛卜生公式,自適應梯形公式,龍貝格算法,運用求解定積分并控制精度的方法。 習題七: 常微分方程數值解法 一、實驗目的 (1)熟悉求解常微分方程初值問題的有關方法和理論,主要是改進歐拉公式,四階龍格-庫塔法和阿當姆斯方法; (2)編制上述方法計算機程序,包括求解微分方程組的計算程序;(3)針對實習題編制程序,并上機計算其所需要的結果; (4)體會各種解法的功能,優缺點及適用場合,會選取適當的求解方法。 二、實驗內容 1、分別用改進歐拉法與四階龍格-庫塔公式(取h?0.1)求解下列微分方程初值問題 2、用四階龍格-庫塔公式(取h?0.1)解下列微分方程組初值問題 三、實驗步驟、程序設計、實驗結果及分析 1、分別用改進歐拉法與四階龍格-庫塔公式(取h?0.1)求解下列微分方程初值問題 a.改進歐拉法(1)程序設計 #include yp=y+h*(*f)(x,y); x=x0+i*h; yc=y+h*(*f)(x,yp); y=(yp+yc)/2; printf(“x[%d]=%fty[%d]=%fn”,i,x,i,y);} } float f(float x,float y){ //return x*x+y*y; //題(1) //return 1/(1+y*y); //題(2) return y-2*x/y; //題(3)} void main(){ float xn=1.0,x0=0,y0=1; ModEuler(f,x0,y0,xn,10);} (2)實驗結果及分析(1) (2) (3) b.四階龍格-庫塔公式(1)程序設計 #include K1=(*f)(x,y); K2=(*f)(x+h/2,y+h*K1/2); K3=(*f)(x+h/2,y+h*K2/2); K4=(*f)(x+h,y+h*K3); y=y+h*(K1+2*K2+2*K3+K4)/6; x=a+i*h; printf(“x[%d]=%fty[%d]=%fn”,i,x,i,y);} } float f(float x,float y){ //return x*x+y*y; //題(1) //return 1/(1+y*y); //題(2) return y-2*x/y; //題(3)} void main(){ float a=0,b=1.0,y0=1;Runge_Kutta(f,a,b,y0,10);}(2)實驗結果(1) (2) (3) 2、四階龍格-庫塔公式解微分方程組初值問題(1)程序設計 #include K1=(*f)(x,y,z);l1=(*g)(x,y,z); K2=(*f)(x+h/2,y+h*K1/2,z+h*l1/2);l2=(*g)(x+h/2,y+h*K1/2,z+h*l1/2); K3=(*f)(x+h/2,y+h*K2/2,z+h*l2/2);l3=(*g)(x+h/2,y+h*K2/2,z+h*l2/2); K4=(*f)(x+h,y+h*K3,z+h*l3);l4=(*g)(x+h,y+h*K3,z+h*l3); y=y+h*(K1+2*K2+2*K3+K4)/6; z=z+h*(l1+2*l2+2*l3+l4)/6; x=a+i*h; printf(“x[%d]=%fty[%d]=%ftz[%d]=%fn”,i,x,i,y,i,z);} } float f(float x,float y,float z){ return 120-2*y+2*z; } float g(float x,float y,float z){ return 2*y-5*z; } void main(){ float a=0,b=1.0,y0=0,g0=0;Runge_Kutta(f,g,a,b,y0,g0,10);} (2)實驗結果 四、總結 通過這次學習,我掌握了根據不同場合選擇不同方法計算求解問題的方法,主要學習了改進歐拉法和四階龍格-庫塔法求解微分方程的求解問題方法。 計算方法上機匯總: 通過對這門課的學習,我們學習了很多計算方程、曲線擬合、求解微分方程的方法。而實習 課讓我們將所學的原理應用到實踐中去,上機編寫程序的過程中我們不斷的運用已學知識,掌握了求解各種實際問題的方法,并且體會了不同的方法的不同結果,從而在不同的場合,要用合適的計算方法來求解問題。我們求解的問題包括誤差分析,線性方程組的求解,微分方程的求解等問題。在選擇合適的計算方法的時候要考慮方法的收斂性,穩定性,以及哪種方法計算速度快,最終結果誤差小。這門課與計算機密切結合并且實用性極強,能夠將所學的知識在實踐中得到應用,加強了我對專業學習的信心。 參考文獻: 【1】孫志忠.計算方法典型例題分析.第二版.北京:科學出版社,2005 【2】孫志忠,袁慰平,計算方法與實習.第二版.南京:東南大學出版社,2011 【3】譚浩強.C程序設計.第四版.北京:清華大學出版社,2010 ◆ 《數值計算方法》 合肥工業大學數學與信息科學系 編 合肥工業大學出版社 ◆ 《計算方法》 鄧建中等編,西安交大出版社,1985。 ◆ 《數值計算和C程序集》蔣長錦編著,中國科學技術大學出版社,1998。◆ 《計算方法引論》徐萃薇編,高等教育出版社,1999。 ◆ 黃友謙,程詩杰,陳浙鵬,《數值試驗》,北京:高等教育出版社,1989 ◆ 蔡大用,《數值分析與實驗學習指導》,北京:清華大學出版社與施普林格出版社,2001 ◆ 肖筱南,《值計算方法與上機實習指導》,北京:北京大學出版社,2004 ◆ A.Quarteroni, R.Sacco, F.Saleri,《Numerical Mathematics》, New York:Springer-Verlag, 2000 數值分析上機實驗報告 姓 名:班 級:學 號:院 系:機械工程學院指導教師:C語言) 2006級 2006050349 (for(j=0;j } void guss(float a[N][N],float b[N])/* 子函數高斯消去法*/ { int i,j; { } printf(“Household變換的結果:”);/*輸出Household變換的結果*/ for(i=0;i for(j=0;j } if(j%N==0)printf(“n”);s=0.0;for(i=j+1;i } for(i=0;i } for(k=0,i=0;i q[i]=y[i]-k*u[i];for(i=0;i } x[N-1]=y[N-1]/u[N-1];for(i=N-1;i>=0;i--)x[i]=(y[i]-a[i][i+1]*x[i+1])/u[i];printf(“消去法的結果:n”);/*輸出消去法的結果*/ for(i=0;i } printf(“n”);} void sor(float a[N][N],float b[N])/*子函數超松馳法*/ { float a1[N][N];int i,j,k,m;float x[N],temp[N][N];float w=1.4,h=0,g=0;for(m=0;m { for(j=1;j<=N;j++){ if(j<=i-1)h+=temp[i-1][j-1]*x[j-1];else if(j==i)h+=0;else h+=temp[i-1][j-1]*x[j-1]; q[i]=a[i][i-1]/u[i-1];u[i]=a[i][i]-q[i]*a[i-1][i];y[i]=b[i]-q[i]*y[i-1];if(i==5)printf(“n”);printf(“x%d=%9.6f ”,i,x[i]); } g=(h+b[i-1])*w;x[i-1]=(1-w)*x[i-1]+g;h=0.0;g=0.0;} } printf(“超松弛法的結果:n”);/*輸出超松弛法的結果*/ for(i=0;i 四、運行結果 Household變換的結果: 12.3841-4.8931 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000-4.8931 25.3984 6.4941 0.0000-0.0000 0.0000-0.0000-0.0000-0.0000 0.0000 6.4941 20.6115 8.2439-0.0000-0.0000-0.0000 0.0000 0.0000 0.0000 0.0000 8.2439 23.4229-13.8801-0.0000 0.0000-0.0000 0.0000 0.0000-0.0000-0.0000-13.880129.6983 4.5345 0.0000 0.0000 0.0000 0.0000 0.0000-0.0000-0.0000 4.5345 16.0061 4.8814 0.0000-0.0000 0.0000-0.0000-0.0000 0.0000 0.0000 4.8814 26.0133-4.5036 0.0000 0.0000-0.0000 0.0000-0.0000 0.0000 0.0000-4.5036 21.2540 4.5045 0.0000-0.0000 0.0000 0.0000 0.0000-0.0000 0.0000 4.5045 14.5341 消去法的結果: x0= 1.075799 x1= 2.275744 x2=-2.855514 x3= 2.293097 x4= 2.112633 x5=-6.423833 x6= 1.357923 x7= 0.634245 x8=-0.587266 超松弛法的結果: x0= 1.073409 x1= 2.272580 x2=-2.856600 x3= 2.292511 x4= 2.112164 x5=-6.422582 x6= 1.357802 x7= 0.634259 x8=-0.587042 五、問題討論: 1.算法分析 SOR方法的矩陣形式為: X(m)=(E-ωL)-1((1-ω)E+ωR)x(m-1)+(E-ωL)-1ωg 若記 Lω=(E-ωL)-1((1-ω)E+ωR),SOR收斂的充要條件是S(Lω)<1.且若A為對稱正定陣,則當松弛因子ω滿足0<ω<2時,SOR方法收斂。此題中矩陣B是對稱正定陣,且是三對角的,所以選擇合適的松馳因子ω,收斂速度是很快的。2.上機出現情況 數組作為子函數參數時,實現的是地址傳遞,會改變原數組中元素的值,因此主函數調用housholder變換子函數后,原數組a[9][9]中的值已經改變為三對角陣。以下的消去法、超松弛法子函數調用的是已經三對角化后的a[9][9]的值。 調用時由于沒有定義housholder變換子函數中數組a[][]的大小,運行時出現以下錯誤提示: error C2087: ' Xn1?? , Zk? mkmax(Xn)sa[0]=a[0][0]-x;if(sa[0]==0)sa[1]=a[0][1]*a[0][1];else sa[1]=a[1][1]-x-a[0][1]*a[0][1]/sa[0];for(i=2;i } float duifen(float a[N][N])/*對分法求取方程的解的子函數*/ { float ss1=0,ss2=23,ss=0,h=0,g=0;float l,ll;h=f(a,ss2);while(1){ ss1=ss;g=f(a,ss);ss=0.5*(ss+23);l=0.5*(ss1+23);if(g-h==1)break;{ if(sa[i-1]*sa[i-2]!=0)sa[i]=a[i][i]-x-a[i-1][i]*a[i-1][i]/sa[i-1];else if(sa[i-2]==0)sa[i]=a[i][i]-x;if(sa[i-1]==0)sa[i]=-1;} { if(sa[i]>=0)hh+=1;else hh+=0;} for(i=0;i float fanmi(float a[N][N])/*反冪法求解方程的解的子函數*/ { float mk=0,t,t1;float z[N],yy[N],a3[N][N];int i,j,k,m,tt;float h=0;float l[N]={0,};t1=duifen(a);/*調用對分法求取方程的解*/ for(i=0;i for(m=0;m } printf(“反冪法的解的特征向量是:n”);{if(m==5)printf(“n”);printf(“%-10.6f”,z[m]);} /*輸出反冪法的解的特征向量*/ return 0;for(m=0;m printf(“n”);main(){ float a[N][N]={{12.3841,-4.8931},{-4.8931,25.3984,6.4941},{0,6.4941,20.6115,8.2439}, {0,0,8.2439,23.4229,-13.8801},{0,0,0,-13.8801,29.6983,4.5345},{0,0,0,0,4.5345,16.0061,4.8814}, {0,0,0,0,0,4.8814,26.0133,-4.5036},{0,0,0,0,0,0,-4.5036,21.2540,4.5045},{0,0,0,0,0,0,0,4.5045,14.5341}}; printf(“對分法的結果是:n”);printf(“d=%f”,duifen(a));/*調用對分法并輸出對分法近似解*/ fanmi(a);/*調用反冪法求解*/ } 四、運行結果 對分法的結果是: d=21.916260 反冪法的結果是: d=21.928129 反冪法的解的特征向量是: 0.157066-0.306359 0.282201 0.285925 0.198640 0.533758 0.462842 1.000000 0.611843 五、問題討論 1.算法分析 1)對分法簡單可靠,數值穩定性較高,對于求少量幾個特征值特別適宜.但收斂速度較慢.2)反冪法是結合對分法使用的,近似值較恰當,其收斂速度是很快.只要迭代兩次就可得到較滿意的結果.但在運用中需把一般矩陣化為Hessebberg陣才可計算.2.上機出現情況 當把對分法及反冪法全部寫在主函數中,實現題目全部要求時,主函數過于冗長,不利于糾錯,也不利于實現共享,通過修改對分法及反冪法為子函數調用,以便于調試,亦有利于共享。 for(j=0;j } b[0]=2*h*b[0];a[i][i-1]=1;a[i][i]=4;a[i][i+1]=1;b[N-1]=2*h*b[N-1];for(i=1;i u[0]=a[0][0];/*消去法求c[i]*/ y[0]=b[0];for(i=1;i } c[N-1]=y[N-1]/u[N-1];for(i=N-2;i>=0;i--) for(i=0;i } s=0.0;for(i=0;i b[N-1]=b[N-1]+b[N-2];q[i]=a[i][i-1]/u[i-1];u[i]=a[i][i]-q[i]*a[i-1][i];y[i]=b[i]-q[i]*y[i-1];c[i]=(y[i]-a[i][i+1]*c[i+1])/u[i];e=fabs(*x-i);if(e>=2) w[i]=0;w[i]=0.5*fabs(e*e*e)-e*e+2.0/3.0;w[i]=(-1.0/6.0)*fabs(e*e*e)+e*e-2*fabs(e)+4.0/3.0;else if(e<=1)else } *x=s;*x1=(c[(int)(m+1)]-c[(int)(m-1)])/2.0;void main(){ } 四、運行結果 三次樣條插值求得的結果是: f(4.563)=1.517932 f'(4.563)=0.249350 五、問題討論: 樣條插值效果比Lagrange插值好,由于樣條插值不必經過所有點,所以沒有Runge現象.而且插值函數比較光滑。 其基本思想是對均勻分劃的插值函數的構造,三次樣條函數空間中不取1,x,x,x,(x-xj)+為基函數,而取B樣條函數Ω3(x-xj/h)為基函數.由于三次樣條函數空間是N+3維的,故我們把分點擴大到N?1X-1,XN+1,則任意三次樣條函數可用Ω3(x-xj/h)線性組合來表示 S(x)= 不同插值問題,若能確定cj由解的唯一性就能求得解S(x).2 33float b[N]={1,0,0.69314718,1.0986123,1.3862944,1.6094378,1.7917595, 1.9459101,2.079445,2.1972246,2.3025851,0.1};float x,x1;float h;h=1;x=4.563;scyt(&x,&x1,b,h);/*調用三次樣條插值子函數*/ printf(“f(4.563)=%.6fn”,x);printf(“f'(4.563)=%.6fn”,x1);printf(“三次樣條插值求得的結果是:n”); ?cjΩ3(x-xj/h)這樣對 j??1 7 4float z;z=pow(x,7)-28*pow(x,4)+14;return(z);float z;z=7*pow(x,6)-112*pow(x,3);return(z);x=fabs(f1(a))>fabs(f1(b))?a:b;/*初始值的選擇*/ } main(){ float a,b; /*變量定義及賦初值*/ float min;float result;a=0.1;b=1.9;min=1e-5;result=ndf(a,b,min);/*調用牛頓法子函數*/ printf(“用牛頓法求方程在取初值為(0.1,1.9)區間端點時的近似根為:n”);printf(“x=%.6fn”,result);} 四、運行結果 用牛頓法求方程在取初值為(0.1,1.9)區間端點時的近似根為: x=0.845497 五、問題討論 1.Newton法收斂速度比較快,是平方收斂,但它是局部收斂。2.采用newton法求方程平方收斂,較為精確。但需求函數導數。 3.初始值取為區間端點xo時,取使f(xo)f′′(xo)>0的一個,本例中取為xo=1.9。 (k) (0) (0) 3x1.42float z;z=pow(3,y)*pow(y,1.4)*(5*y+7)*sin(y*y);return(z);s=0;for(i=1;i<=(pow(2,j-1));i++)s+=(b-a)*(*f)(a+(2*i-1)*(b-a)/pow(2,j))/pow(2,j-1);t[1][j]=(t[1][j-1]+s)/2; } { } z=t[i+1][0];return(z);for(j=1;j<=N-i+1;j++)t[i+1][j-1]=(pow(4,i)*t[i][j]-t[i][j-1])/(pow(4,i)-1);break;if(fabs(t[i][0]-t[i+1][0])<=min)main(){ } 四、運行結果 用Romberg算法求積分的結果(允許誤差為0.00001): I=440.536011 五、問題討論: 1.算法分析 1)Romberge算法的優點是: 把積分化為代數運算,而實際上只需求T1,以后用遞推可得.算法簡單且收斂速度快,一般4或5次即能達到要求.2)Romberge算法的缺點是: 對函數的光滑性要求較高,計算新分點的值時,這些數值的個數成倍增加。 2.上機出現問題 本程序一開始編寫時,是利用函數的遞歸調用來實現,編譯正常通過,但運行時出現異常,經分析可能是多次遞歸產生誤差,改用數組代替遞歸來存放Tij的值時,運行正常。 (i)float a,b;/*變量定義及初始化*/ float min;float result;float(*p)(float);a=1;b=3;min=1e-5;p=f;result=lbg(a,b,min,p);/*調用龍貝格法求積分子函數*/ printf(“用Romberg算法求積分的結果(允許誤差為0.00001):n”);printf(“I=%.6fn”,result); } } for(i=0;i<4;i++){ } fkt(work1,work2);*t=ttemp+temp[i];for(j=0;j } } 四、運行結果 定步長四階Runge-Kutta法求微分方程組解的結果: T Y1 Y2 Y3 0.025000| 0.025000| 0.151579| 8.346120 0.045000| 0.045000| 0.312984| 7.538067 0.085000| 0.085000| 0.560777| 4.944312 0.100000| 0.100001| 0.629078| 4.178828 五、問題討論: 1.算法分析 1)Runge_Kutta方法的優點: 精度高,不必用別的方法求開始幾點的函數值。 可根據f'(t,y)變化的情況與需要的精度自動修改步長。程序簡單,存儲量少。方法穩定。 rgkt(n,&t,step,&y,work1,work2,work3);/*調用Runge-Kutta算法求解*/ if(i==49||i==89||i==169||i==199)printf(“%9.6f|%9.6f|%9.6f|%9.6fn”,t,y[0],y[1],y[2]);2)Runge_Kutta方法的缺點: 每步要計算函數值f(t,y)四次,在f(t,y)較復雜時,工作量大, 且每一步缺乏可靠的檢查。 2.上機出現情況 當用主函數實現題目全部要求時,主函數過于冗長,不利于修改和糾錯,也不利于實現共享,通過修改Runge_Kutta法及函數表達式為子函數調用,并把一些條件語句放進子函數中,主函數只控制初始值及結果精度要求,經如此修改后便于閱讀和調試。第五篇:《數值分析》上機實習報告