第一篇:电子电路上机报告三-差动放大器分析与设计
电子电路上机实验报告
班级: 学号: 姓名: 实验三 差动放大器分析与设计
一、电路设计
二、直流工作点分析
由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 <0.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,在此唯一需要修改的是将图纸大小(sheet 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,分析其误差的变化
n1100002、已知连分数fb0a1,利用下面的算法计算f:
b1a2/b2a3/(...an/bn)ai
1(in1,n2,..., 0fd0 di1写一程序,读入n,b0,b1,...,bn,a1,...,an,计算并打印f dnbn,dibi
3、给出一个有效的算法和一个无效的算法计算积分
xnyndx
(n0,1,..., 104x1N11311
4、设SN2,已知其精确值为
22NN1j2j1(1)编制按从大到小的顺序计算SN的程序 1(2)编制按从小到大的顺序计算SN的程序
(3)按两种顺序分别计算S1000,S10000,S30000,并指出有效位数
三、实验步骤、程序设计、实验结果及分析
21、用两种不同的顺序计算n,分析其误差的变化
n110000(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、已知连分数fb0(1)实验步骤: 利用 dnbn,dibia1,计算f:
b1a2/b2a3/(...an/bn)ai1,0
(in1,n2,...,fd0,计算f
di1(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、给出一个有效的算法和一个无效的算法计算积分 xnyndx (n0,1,..., 104x11(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 j2N11311,已知其精确值为 22NN1j21(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)xe0 (2)xe10(3)lgxx20 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、分别用抛物线yabxcx2和指数曲线yaebx拟合所给数据,并比较这两个拟合函数的优劣。 2、按所给实验数据,用形如yabx的抛物线进行最小二乘拟合。 三、程序设计、结果分析 1、分别用抛物线yabxcx和指数曲线yae拟合所给数据 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、分别用改进欧拉法与四阶龙格-库塔公式(取h0.1)求解下列微分方程初值问题 2、用四阶龙格-库塔公式(取h0.1)解下列微分方程组初值问题 三、实验步骤、程序设计、实验结果及分析 1、分别用改进欧拉法与四阶龙格-库塔公式(取h0.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维的,故我们把分点扩大到N1X-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)这样对 j1 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法及函数表达式为子函数调用,并把一些条件语句放进子函数中,主函数只控制初始值及结果精度要求,经如此修改后便于阅读和调试。第五篇:《数值分析》上机实习报告