1.编程实例
下面的例子将向大家介绍如何用 MATLAB
解决问题。
例1 温度转换程序
问题:
设计一个 MATLAB 程序,读取一个华氏温度的输入,输出开尔文温度。
答案:
华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式为:
在物理学参考书中举了一些例子,我们可以用来检验我们程序是否正确。例如
我们设计程序的步骤如下
1.
提示用户键入华氏温度值
2.
读取输入值
3.
通过关系式转换为开氏温度
4.
输出结果,结束
我们将会用
input
函数输入华氏温度,用
fprintf
函数输出结果。
clc
clear
% 目的:
% 将一个以华氏度为单位的温度转换为以开尔文为单位的温度。
% 定义变量:
% temp_f -- 华氏度温度
% temp_k -- 开尔文温度
% 提示用户输入华氏度温度
temp_f=input('请输入华氏度温度:');
% 将华氏度温度转换为开尔文温度
temp_k=(5/9)*(temp_f-32)+273.15;
% 输出结果
fprintf('%6.2f 华氏温度 = %6.2f 开尔文温度.\n', temp_f,temp_k);
运行结果:
这个结果和物理教科书的结果相同。在本程序中,
我们重复出带单位的输入值和输出值. 只有带上单位输出才有意义. 按照惯例
,
任何输入变量和输出变量的单位都应打印出来
.
好的编程习惯
当你读取和写入数据时
,
使用适当的单位
例2 负载的最大输出功率
问题:
一个内阻 Rs = 50Ω ,电动势 V = 120V 的电源驱动一个负载 R L 。当 R L 为多少时, R L的功率最大?在这种情况下,功率为多少?画以 R L 为自变量的 R L 功率图。
一个内阻 Rs = 50Ω ,电动势 V = 120V 的电源驱动一个负载 R L 。当 R L 为多少时, R L的功率最大?在这种情况下,功率为多少?画以 R L 为自变量的 R L 功率图。
答案:
在本程序中,我们需要改变 R
L
的值,然后计算出每一个
R
L
的功率。
R
L功率的表达式为:
I代表流经负载的电流。电流可由欧姆定律计算得到。
这个问题解决的步骤如下
1. 创建一个数组。这个数组是以
1
为起始项,以
1
步长的等差数组,共
100 项,这是 R
L
的取值。
2. 计算
R
L
的电流,
3. 计算每个
R
L
的功率。
4. 画出
R
L
的功率图,以确定
R
L
为多少时其功率最大。
整个程序的代码如下:
clc
clear
% 目的:
% 计算并绘制负载电阻作为函数的功率。
% 定义变量:
% amps -- 负载电流(安培)
% pl -- 供电给负载的功率(瓦特)
% rl -- 负载电阻(欧姆)
% rs -- 电源内部电阻(欧姆)
% volts -- 电源电压(伏特)
% 设定电源电压和内部电阻的值
volts = 120;
rs = 50;
% 创建一个负载电阻数组
rl = 1:1:100;
% 计算每种电阻下的电流
amps = volts ./ (rs + rl);
% 计算每种电阻下负载所消耗的功率
pl = (amps.^2) .* rl;
% 绘制功率与负载电阻之间的曲线
plot(rl,pl);
title('功率与负载电阻之间的关系图');
xlabel('负载电阻(欧姆)');
ylabel('功率(瓦特)');
grid on;
当这个程序运行时,产生的图象如图1
。从这个图我们可知当负载电阻为
50Ω时,功率最大。最大功率为
72W
。
注意在本例中,用的是数组运算符.*,.^
和
./.
这些运算符将会使数组
amps
和
pl 按元素一一对应计算
.
例 3 用 C14 确定年代
一个元素的放射性同位素是不稳定元素的一种特殊形态.
在一段时间内
,它会自然的衰变为另一种元素
.
衰变一种呈指数下降的过程
.
如果
Q
0
是放射性物质在
t
=0
时的初始量
,那么它的质量与变量
t
的关系式为
其中 λ
代表衰变率
.
因为放射性元素的衰变是以一定的速率发生的,我们可以把它当作一个时钟来测定的衰变开始的时间。如果我们知道衰变开始时物质的质量和现在放射性元素剩余的质量
,我们可以根据上面的公式
换算出衰变时间
t
,
即
这个公式在科学的许多领域有着广泛的应用
.
例如
,
考古学家可以根据
C14
的衰变周期
,来确定古生物距今生活的年代
.
现在活着的生物
C14
的含量是不变的
,
所以可以根据古生物 C14的现存量来确定古生物的生存年代
.
已知
C14
的衰变率
λ
为
0.00012097/
年
,
所以如果
C14 的剩余量可以通过测量得到
,
那么我们就可以根据公式
2.9
算出这个生物活在多少年之前
.
编定一个程序,
读取样品中
C14
剩余量的百分比
,
计算样品距今的年代
,
并打印出结果
.
这个问题解决的步骤如下
1. 提示用户输入样品中
C14
的剩余量
2. 读取百分比
3. 将百分比转化成分数
Q
0/
Q
4. 利用公式
计算出距今的年数
5. 输出结果
,
结束
.
代码如下
clc
clear
% 目的:
% 根据样本中剩余原始碳14的百分比计算样本年限
% 定义变量:
% age -- 样本年龄(年)
% lamda -- 碳14的衰变常数,单位为1/年
% percent -- 测量时剩余的碳14含量的百分比
% ratio -- 测量时剩余的碳14含量与原始碳14含量之比
% 设定碳14的衰变常数
lamda = 0.00012097;
% 提示用户输入碳14剩余百分比
percent = input('请输入碳14剩余百分比:\n');
% 计算样本中的剩余碳14含量与原始碳14含量之比
ratio = percent / 100; % 转换为分数比例
% 计算样本的年龄
age = (-1.0/lamda) * log(ratio); % 单位为年
% 展示计算出的样本年龄
string = ['样本年龄为 ' num2str(age) '年。'];
disp(string);
运行结果为:
2.调试程序
有一个古老的说法,
人这一生唯一能够确定的东西是死亡和税收
.
我们在这里再增加一项, 无论你编定多大的程序
,
你第一次运行时
,
肯定通不过
!
程序中的错误我们称之为
BUGS,找出并排出它们
,
我们称之为调试
(debugging).
已知一个程序
,
而无法运行
,
我们怎样调试它呢?在
MATLAB
中有三种类型的错误
.
第一种错误是
语法错误
.
语法错误是
MATLAB 自身的错误,例如拼写错误和标点错误.当编译 M 文件时,maltab 编译器将会找出这些错误.例如,语句
x = ( y + 3 ) / 2 );
有一个语法错误,
因为其括号不平衡. 如果这句存储在
M
文件
test.m
中,当
test
编译时,将会出现下面的信息。
第二种类型的错误是一种运行时错误。当一个非法的数学运算出现在程序的过程(例如,除以
0)
,将会出现运行时错误。这些错误将会使程序返回
Inf
或
NaN,用来参与下一步的运算。导致这个程序的结果变无效。
错误的第三种形式是逻辑错误(logical error).逻辑错误是指编译和运行都能通过,而产生了错误的结果。
在编程过程中出现的最普遍的错误是书写错误。一些书写错误可能产生无效的MATLAB 语句。这些错误产生的语法错误可能会被编译器发现。另一个书写错误发生在变量名的书写上。例如,变量中的字符可能被调换,漏写或错写。这样就会创建一个新的变量,在前面我们已经提到,MATLAB 能够很容易地创造一个新的变量,它不会发现这个错误。、书写错误也能导致逻辑错误。例如,如果变量 vel1 和 vel2 都在程序中代表速度,如果一时疏忽用其中一个替代了另一个,那么你就只能用人工检查代码找出此类错误。有的时侯程序开始时能够执行,但是运行时错误和逻辑错误可能在执行中发生。在这种情况下,可能是输入错误,也可能是逻辑结构错误。找出这类错误的第一步是检查程序的输入数据。既可以去掉输入语句后的分号,也可以加入一个多余的输出语句以证明这个输入值是不是你想要的。如果你已经排除了变量名错误和输入值错误,接着你要处理的是逻辑错误。你应该检测是否有逻辑错误,应当检查每一个赋值语句。
1.如果一个赋值语句非常的长,把他分成许多小的赋值语句。小的语句易证明。
2.检查你的赋值语句中括号的放置。在赋值语句中,由于括号导致运算顺序错误是极其常见的错误。如果你对运算顺序仍有疑问,应该多加括号,使之更加清晰。
3.保证每个变量正确的初始化。
4.保证函数中用到的单位统一。例如,在三角函数中输入必须是弧度值,而不是角度值。如果你仍然得到的是错误的语句,在更多的位加上输出语句,以检查中间计算。如果你能确定错误的位置,那么你就知道在那里找到问题所在,百分九十五地在这片区域内。如果问题依然存在,那么这时你就应当把你遇到的问题解释给你的同学或老师,让他们给你检查错误。一个人看自己编写的代码找不到错误是非常常见的,而其他的人则可以迅速地找出错误的地方,而这个地方你可能已经看了一次又一次。
好的编程习惯
确保你在编程设计过程:
1.
初始化所有变量
2.
适当应用括号使运算顺序清晰以减少调试的工作量
在 MATLAB
中有一个专门的调试器,叫做 symbolic debugger. symbolic debugger 允许用户一句一句地执行语句,检测出所有的变量值,它能让你看到所有的中间值,而不用在其中加入输出语句。我们将会在后面介绍
symbolic debugger
。