MATLAB任务解决方案详解
在MATLAB编程中,解决各种任务需要掌握不同的方法和技巧。以下将详细介绍一系列MATLAB任务的解决方案。
1. 第1章任务解决方案
- Solution 1.1 :求解一系列数学问题的MATLAB代码如下:
x = 1.3;
p = x^2+3*x+1;
x = 30/180*pi;
y = sin(x);
x = 1;
f = atan(x);
x = sqrt(3)/2;
h = acos(x);
g = sin(h);
运行此代码返回的值为:6.5900, 0.5000, 0.7854(即π/4)和0.5000。
-
Solution 1.2
:计算函数y(x) = |x| sin x²,使用以下代码:
x = pi/3;
y = abs(x)*sin(x^2);
对于x = π/6,同样使用类似代码。需要注意括号和语法。
-
Solution 1.3
:确定以下数量的MATLAB命令为:
sin(pi/2);
cos(pi/3);
tan(60/180*pi);
x=0.5; log(x+sqrt(x^2+1));
x=1; log(x+sqrt(x^2+1));
x=0; x/((x^2+1)*sin(x));
x=pi/4; x/((x^2+1)*sin(x));
注意,倒数第二个部分会生成NaN,因为MATLAB不知道如何计算零除以零。
-
Solution 1.4
:可以通过输入所有值或利用MATLAB对向量的操作能力来完成。代码如下:
x = [0.3 1/3 0.5 1/2 1.65 -1.34];
round(x);
ceil(x);
floor(x);
fix(x);
此示例有助于理解各种MATLAB命令对不同取整方式的作用。
-
Solution 1.5
:使用y值为4来说明rem和mod的区别:
x=[3 4 5];
rem(x,4);
mod(x,4);
rem(x,-4);
mod(x,-4);
当第二个参数为正时,rem和mod等价;当为负时,余数会带符号。
-
Solution 1.6
:MATLAB代码如下:
x = 1:0.1:2;
% Part 1
y = x.^3+3*x.^2+1;
% Part 2
y = sin(x.^2);
% Part 3
y = (sin(x)).^2;
% Part 4
y = sin(2*x)+x.*cos(4*x);
% Part 5
y = x./(x.^2+1);
% Part 6
y = cos(x)./(1+sin(x));
% Part 7
y = 1./x+x.^3./(x.^4+5*x.*sin(x));
- Solution 1.7 :代码为:
x = 3:0.01:5;
y = x./(x+1./x.^2);
- Solution 1.8 :代码如下:
x = -2:0.1:-1;
f = 1./x;
y = f.^3+f.^2+3*f;
- Solution 1.9 :正确的代码应该是:
clear all;
x = linspace(0,1,200);
g = x.^3+1;
h = x+2;
z = x.^2;
y = cos(x*pi);
f = y.*z./(g.*h);
f(200);
原代码存在一些错误,如第二行应放在第一行,linspace默认点数为100,需要指定为200;g的定义和f的计算缺少点乘;变量名大小写要区分;计算y时余弦函数参数需要括号和乘号;f和分数分母需要括号;最后需要打印答案。
-
Solution 1.10
:正确代码为:
x = linspace(-2,2,20);
c = [1 0 0 0 -1];
y = polyval(c,x);
plot(x,y);
原代码第一行定义的向量会包含21个元素;四次多项式应该有5个系数,c的定义少了一个零;绘图命令中x和y不需要转置。
-
Solution 1.11
:修正后的代码为:
x = 0:0.1:3;
f = x.^3.*cos(x+1);
% x = 2
f(21);
% x = 3
f(end);
2. 第2章任务解决方案
- Solution 2.1 :只需输入代码并正确保存答案。
- Solution 2.2 :修改后的代码如下:
a = input('Enter a : ');
b = input('Enter b : ');
res = a^b;
str1 = 'The answer is ';
str2 = ' when ';
str3 = ' is raised to the power ';
disp([str1 num2str(res) str2 num2str(a) str3 num2str(b)]);
- Solution 2.3 :实现此功能的函数为:
function [out] = twox(x)
out = 2.^x;
end
注意使用点乘,以便可以用向量(甚至矩阵)调用。可以用x = 1:8进行测试。
-
Solution 2.4
:可以使用一个函数或两个代码来完成计算:
% 一个函数
function [out1,out2] = func(x,y)
out1 = x.^2 - y.^2;
out2 = sin(x+y);
end
% 两个代码
function [out] = func1(x,y)
out = x.^2 - y.^2;
end
function [out] = func2(x,y)
out = sin(x+y);
end
若要将范围扩展到[0, 2π],需要将第一行改为x = 0:pi/10:2
pi。
-
Solution 2.5
*:修改后的代码为:
function [out1,out2,out3] = xfuncs(x)
out1 = sin(x);
out2 = cos(x);
out3 = out1.^2 + out2.^2;
end
这里使用out1和out2来设置out3的值,实际上out3始终为1。
-
Solution 2.6
:此代码接收两个输入并返回两个输出:
function [outx,outy] = mapcode(inx,iny)
outx = mod(inx+iny,1);
outy = mod(inx+2*iny,1);
end
- Solution 2.7 :需要将第二行修改为y = x.^3+3*x,将第一行修改为x = -4:1/4:6。最好使用clear all清除变量。
-
Solution 2.8
:此方程是关于x²的二次方程,其根为:
[x^2 = \frac{-1 \pm \sqrt{1 - 4a}}{2}]
为了有实根,需要1 - 4a ≥ 0,即a ≤ 1/4,且x²必须为正,即(\sqrt{1 - 4a} > 1),所以a ≤ 0。 - Solution 2.9 :使用步长为1/10来获得相对平滑的函数,代码如下:
x = -1:0.1:1;
f = x+3;
g = x.^2+1;
fg = f.*g;
f_over_g = f./g;
clf;
plot(x,[f; g; fg; f_over_g]);
legend('f','g','f*g','f/g',0);
添加了图例,使用参数0让MATLAB将图例放在最佳位置。
-
Solution 2.10
:对以下代码进行改进:
-
第一个代码
:
x = 4;
y = x+2;
z = 1/(y^2*pi);
原代码第一行末尾添加分号抑制输出;第二行不能将x + 2赋值给y,应将y赋值为x + 2;第三行π的变量为小写p,缺少乘号和分母括号。
-
第二个代码
:
N = input('Enter N ');
sum = 0;
for j = 1:N
sum = sum + 1/j+ 1/((j+2)*(j+3));
end
disp(['The answer is ' num2str(sum)]);
原代码第一行缺少单引号和分号;for循环中变量n应改为N,循环变量i和内部使用的j不一致;分数分母缺少括号;显示行缺少方括号,答案需要转换为字符串,且sum未在循环外初始化为0。
-
第三个代码
:
x = 0.0:0.1:1.0;
f = x.*cos(x)./((x.^2+1).*(x+2));
原代码第一行使用两个等号错误,应使用一个等号;第二行分子缺少乘号和括号,分母括号不平衡,使用了方括号应改为圆括号,除法后有多余乘号,操作向量时运算符应加点。
-
第四个代码
:
w = ones(1,9);
w(1) = 1;
for j = 1:4
w(2*j) = 3;
w(2*j+1) = 2*j+1;
end
原代码第一行得到的是9×9矩阵,应改为行向量;for循环缺少乘号和end语句,行末冒号应改为分号。
-
Solution 2.11
:
-
(a) 将英里每小时转换为千米每小时
:
s = 'Enter speed in mph ';
sp_mph = input(s);
sp_yards_ph = sp_mph*1760;
sp_inch_ph = sp_yards_ph*36;
sp_cm_ph = sp_inch_ph*2.54;
sp_m_ph = sp_cm_ph/100;
sp_km_ph = sp_m_ph/1000;
disp(['Speed in km/h is ' num2str(sp_km_ph) ]);
- **(b) 将米每秒转换为英里每小时**:
s = 'Enter speed in m/s ';
sp_mps = input(s);
sp_cmps = sp_mps*100;
sp_inch_ps = sp_cmps/2.54;
sp_yard_ps = sp_inch_ps/36;
sp_miles_ps = sp_yard_ps/1760;
sp_mph = sp_miles_ps *3600;
disp(['Speed in mph is ' num2str(sp_mph)]);
- **(c) 将上述转换写成函数**:
function [output] = change(input);
sp_mph = input;
sp_yards_ph = sp_mph*1760;
sp_inch_ph = sp_yards_ph*36;
sp_cm_ph = sp_inch_ph*2.54;
sp_m_ph = sp_cm_ph/100;
sp_km_ph = sp_m_ph/1000;
output = sp_km_ph;
end
- **(d) 短跑运动员10秒跑100米,平均速度为22英里每小时**。
- Solution 2.12 :使用以下代码:
x = linspace(-pi/2,pi/2);
f = x./(1+x.^2);
g = tan(x);
fg = g./(1+g.^2);
gf = f./(1+f.^2);
plot(x,fg,x,gf);
- Solution 2.13 :代码如下:
a = input('Coefficient of x squared: ');
b = input('Coefficient of x: ');
c = input('The constant: ');
y = linspace(0,pi);
x = sin(y);
q = a*x.^2+b*x+c;
plot(y,q);
3. 第3章任务解决方案
- Solution 3.1 :所需代码为:
s = 0;
for i = 1:100
s = s+1/i^2;
end
disp(['Required value is ' num2str(s)]);
将int2str改为num2str,因为答案不是整数。
-
Solution 3.2
:只需将for循环行修改为for i = 1:2:100,得到以2递增的向量。
-
Solution 3.3
:将f.m代码修改为:
function [value] = f(i)
value = sin(i*pi/2)/(i^2+1);
end
然后使用相同的代码。
-
Solution 3.4
:使用以下代码:
x = 0:pi/4:pi;
f = x.^2+1;
- Solution 3.5 :代码修改为:
v = 0:0.25:0.75;
cosx = zeros(size(v));
N = 10; range = 0:N;
ints = 2*range;
for n = range
cosx = cosx + (-1)^n*v.^ints(n)/factorial(ints(n));
end
此代码给出的答案非常准确,MATLAB计算的余弦值和级数答案的差值小于eps。
-
Solution 3.6
:可以使用以下简单代码:
s(1) = 1;
for n = 1:2000
s(n+1) = s(n)+1/(n+1)^2;
end
此值除以π²可发现c约为6,实际上(\sum_{i = 1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6})。
-
Solution 3.7
:使用嵌套循环结构解决此任务:
for p = 1:4
sum = 0;
for j = 1:(p+1)
sum = sum + j^p;
end
disp([' sum for p=' int2str(p) ' is ' int2str(sum)]);
end
- Solution 3.8 :此任务的代码为:
sumln(1) = -1;
for n = 1:1000
sumln(n+1) = sumln(n)+(-1)^(n+1)/(n+1);
end
sum2(1) = 1/2;
for n = 1:1000
sum2(n+1) = sum2(n)+1/((n+1)*(n+2));
end
- Solution 3.9 :最简单的方法是x > 2 & x < 4,也可以使用~xor(x >= 2, x <= 4);第二个例子可以使用xor(x > 3, x < -1)或x > 3 | x < -1。
- Solution 3.10 :mod(n, 2) == 0表示n为偶数,要确保n > 20时才成立,需要mod(n, 2) == 0 & n > 20。
- Solution 3.11 :计算tan(73π/4),由于tan函数的周期性,其值等于tan(π/4) = 1,所以第一个条件为真,x设为2,floor(x)等于x,x设为10,不是质数,返回字符串“False”。可以尝试初始值x = 3。
- Solution 3.12 :使用以下代码:
start = 1/7;
next = mod(5*start,1);
while floor(next*7) ~= floor(start*7)
next = mod(5*next,1);
end
使用复杂结构处理MATLAB的舍入误差。
-
Solution 3.13
:代码如下:
n = 1:50;
f = n.^3-n.^2+40;
ii = find(f > 1000 & mod(n,3) ~= 0);
n(ii);
- Solution 3.14 :关键是从字符串“abcdefghij”开始,代码如下:
str = 'abcdefghij';
msg = 'Enter an integer from 1 to 10: ';
n = input(msg);
while (round(n)~=n) | (n<1 | n>10)
warning(' Not valid ');
n = input(msg);
end
str(1:n);
- Solution 3.15 :使用两个函数来解决:
function [val] = isletter(charac)
lchar = lower(charac(1));
if lchar>='a' & lchar <='z'
val = 1;
else
val = 0;
end
end
function [val] = isdigit(charac)
lchar = charac(1);
if lchar>='0' & lchar <='9'
val = 1;
else
val = 0;
end
end
msg = 'Please enter a letter and a digit ';
str = input(msg,'s');
while ~isletter(str(1)) | ~isdigit(str(2))
warning('This is not valid');
str = input(msg,'s');
end
- Solution 3.16 :使用以下代码:
x = linspace(-3,5,100);
for i = 1:length(x)
if x(i) >= -1 & x(i) <= 1
f(i) = x(i)^2;
elseif x(i) > 1 & x(i) < 4
f(i) = 1;
else
f(i) = 0;
end
end
plot(x,f);
axis([-3 5 -0.5 1.5]);
最后一个命令用于区分曲线和坐标轴。
-
Solution 3.17
:使用以下代码:
x = -3:0.1:3;
g = cos(pi*x);
izero = find(abs(g)<=1e-15);
ii = find(abs(g)>=1e-15);
f(izero) = NaN;
f(ii) = 1./g(ii);
plot(x,f);
选择10⁻¹⁵是为了接近奇点。
-
Solution 3.18
:修正后的代码为:
x = linspace(-4,4);
N = length(x);
for j = 1:N
if x(j) >= 0 & x(j) <= 1
f(j) = x(j);
elseif x(j) >= 1 & x(j) < 2
f(j) = 2 - x(j);
else
f(j) = 0;
end
end
原代码第一行拼写错误,应为linspace;第二行缺少括号和分号;for循环使用分号错误,应使用冒号;if和elseif语句中第二个引用x数组使用i错误,应使用j;逻辑表达式应使用&和|;变量zero未定义;缺少end语句。
4. 第4章任务解决方案
- Solution 4.1 :函数f(x) = g(x)h(x)的零点出现在g(x)和h(x)的零点处,前提是两个函数都不是奇异的。在这种情况下,g(x) = x在x = 0处为零,h(x) = sin x在0, π, 2π和3π(在[0, 10]范围内)处为零。
- Solution 4.2 :cosh x = (eˣ + e⁻ˣ)/2,要使cosh x为零,需要eˣ = -e⁻ˣ,即e²ˣ = -1,但eˣ > 0对于所有x都成立,所以cosh x永远不为零。sinh x = (eˣ - e⁻ˣ)/2,要使sinh x为零,需要e²ˣ = 1,即x = 0,这是sinh x的唯一孤立零点。函数f(x)的零点出现在coshm x和sinhn x的零点处,仅在x = 0处(此时为n重零点)。
- Solution 4.3 :考虑方程的判别式b² - 4。对于两个实根,b² > 4,即|b| > 2;对于一个实根,判别式为零,即b = 2;对于复根,判别式为负,即|b| < 2。可以使用以下代码进行图形验证:
b = input('Value of b ');
x = -10:0.1:10;
f = x.^2+b*x+1;
plot(x,f);
- Solution 4.4 :将方程写成(\frac{\cos\theta\sin x + \sin\theta\cos x}{\cos\theta})的形式,其中(\tan\theta = \beta),则(\sin\theta = \frac{\beta}{\sqrt{1 + \beta^2}}),(\cos\theta = \frac{1}{\sqrt{1 + \beta^2}})。函数f(x)可以写成(f(x) = \frac{\sin(\theta + x)}{\cos\theta}),其零点为(\sin(\theta + x) = 0),即x = nπ - θ,其中(\theta = \sin^{-1}(\frac{\beta}{\sqrt{1 + \beta^2}}))。如果β = 0,则θ = 0;如果β = 1,则θ = π/4。
- Solution 4.5 :方程f(x) = 0可以改写为x = cos⁻¹(sin x/2),固定点迭代方案为xₙ₊₁ = cos⁻¹(sin xₙ/2),相应代码为:
function g = eqn(x)
g = acos(sin(x)/2);
end
函数的根为nπ + θ,其中(\theta = \sin^{-1}(\frac{2}{\sqrt{5}}))。
-
Solution 4.6
:方程的根为(x_b = \frac{-b \pm \sqrt{b^2 - 4}}{2})。考虑选项g(x) = -(x² + 1)/b,其导数(g’(x) = -\frac{2x}{b}),在根处(g’(x_b) = 1 \mp \sqrt{1 - \frac{4}{b^2}})。当|b| > 2时,负号对应的根的导数绝对值大于1,正号对应的根的导数绝对值小于1。对于另一个选项,情况相反。可以使用以下代码:
function g = eqn(x)
b = 3;
g = -(x^2+1)/b;
end
或使用替代的最后一行g = -sqrt(-(b
x+1)),从初始猜测-1开始,根据不同的固定点方案得到不同的根。
-
Solution 4.7
*:将func.m文件改为:
function [f] = func(x)
f = 2*x.^2-x.^3+sin(x);
end
使用该例程生成绘图,使用2和3作为范围的端点,得到根为2.1741,迭代14次,容差为1×10⁻⁴。
-
Solution 4.8
:函数f(x) = cos 3x在0到π范围内有三个零点。使用整个范围,会遇到左根π/6。对于其他两个范围,可以选择下根或上根。该方案对于奇数个根仍然有效。
-
Solution 4.9
:设置以下例程:
function [f] = func(x)
f = x.*cos(x)-sin(x);
end
function [fp] = func_prime(x)
fp = -x.*sin(x);
end
function [f] = func(x)
f = (x.^3-x).*sin(x);
end
function [fp] = func_prime(x)
fp = (3*x.^2-1).*sin(x) + (x.^3-x).*cos(x);
end
第一个函数的根在x = 0和x ≈ ±4.41,以及随着x增加趋近于cos x零点的许多其他根。第二个函数的零点在x = 0和1,以及nπ(n ∈ Z)处。
-
Solution 4.10
:函数的零点出现在x - x³ = nπ处。可以先绘制函数图像来获得初始估计,然后使用False Position.m代码:
>> False_Position
Starting guess point 1 :0.8
Starting guess point 2 :1.2
Root = 0. .=. (root output)
Root = 0.9999999982
>> False_Position
Root = 0.999999982 found in 12 iterations.
>> False_Position
Starting guess point 1 :1.6
Starting guess point 2 :1.8
Root = 1.690631797 found in 4 iterations.
第一个根对应n = 0。函数随着x增加变得非常振荡,需要更多根时可能会有问题,可以使用roots函数求解三次方程x - x³ = nπ的根。
-
Solution 4.11
:使用以下代码:
function [f,fp,fpp] = fun2(x);
f = x.^3-4*x.^2+5*x+2;
fp = 3*x.^2-8*x+5;
fpp = 6*x.^2-8;
end
根在1(二重根)和2处。
-
Solution 4.12
:可以使用内联代码roots([1 1 1 1])和roots([1 0 0 1 -2 -4])计算根。
-
Solution 4.13
:使用以下代码:
function [f]=func1(x)
f = x.*sin(x)+cos(x);
end
然后使用fzero(‘ff’, 3)得到根约为2.7984。对于其他情况,根为sin x = 0或sin x = ±1,即x = nπ/2(n ∈ Z),此时fzero会误将函数变号当作根。
-
Solution 4.14
:函数J₁/₂(x)实际上是(\frac{\sin x}{\sqrt{x}}),其根为nπ。使用fzero的代码为:
function [f] = ourbess(x)
f = besselj(1/2,x);
end
然后使用fzero(‘ourbess’, 3)。
-
Solution 4.15
:要找到函数f(x) = x sin x - x² cos x - 1的零点,其导数f’(x) = (1 + x²) sin x - x cos x。正确的定义为:
function [out] = f(in)
out = in.*sin(in)-in.^2.*cos(in)-1;
end
function [out] = fp(in)
out = (1+in.^2).*sin(in)-in.*cos(in);
end
x = 0;
for j = 1:10
x = x - f(x)/fp(x);
end
原问题中表达式的第二项写反了,此代码可以写得更简洁。
通过以上详细的解决方案,可以更好地理解和解决各种MATLAB任务。在实际应用中,根据具体问题选择合适的方法和代码,同时注意代码的正确性和效率。希望这些内容对大家在MATLAB编程中有所帮助。
3. 各章节任务解决方案总结
为了更清晰地展示各章节任务的主要内容和关键代码,我们将以表格形式进行总结。
| 章节 | 任务 | 主要内容 | 关键代码 |
|---|---|---|---|
| 第1章 | Solution 1.1 - 1.11 | 涵盖数学计算、向量操作、函数求值、绘图等基础操作 |
如
x = 1.3; p = x^2+3*x+1;
等
|
| 第2章 | Solution 2.1 - 2.13 | 包括代码输入输出、函数定义、速度单位转换、绘图等 |
如
function [out] = twox(x); out = 2.^x;
等
|
| 第3章 | Solution 3.1 - 3.18 | 涉及循环求和、条件判断、逻辑运算、误差处理等 |
如
s = 0; for i = 1:100; s = s+1/i^2; end;
等
|
| 第4章 | Solution 4.1 - 4.15 | 主要是函数零点求解、方程根的分析等 |
如
function [f] = func(x); f = 2*x.^2-x.^3+sin(x);
等
|
4. 常见错误及解决方法
在编写MATLAB代码时,常常会遇到一些错误。以下是一些常见错误及相应的解决方法。
4.1 语法错误
- 错误描述 :如变量名大小写错误、括号缺失、运算符使用错误等。
-
解决方法
:仔细检查代码,注意变量名的大小写一致性,确保括号、运算符等使用正确。例如,在计算
y = cos(x*pi)时,要保证pi为小写,且x与pi之间有乘号。
4.2 逻辑错误
- 错误描述 :代码逻辑不符合预期,如循环条件错误、判断条件错误等。
-
解决方法
:分析代码逻辑,使用调试工具或添加输出语句,逐步检查代码执行过程。例如,在
for循环中,要确保循环变量的范围和步长设置正确。
4.3 数据类型错误
- 错误描述 :使用不匹配的数据类型进行操作,如将字符串与数值直接运算等。
-
解决方法
:使用合适的函数进行数据类型转换,如
num2str将数值转换为字符串。例如,在输出结果时,使用disp([str1 num2str(res) str2 ... num2str(a) str3 num2str(b)])。
5. 实际应用案例
下面通过几个实际应用案例,展示如何运用上述知识解决实际问题。
5.1 物理问题:速度单位转换
在物理实验中,我们可能需要将速度从英里每小时转换为千米每小时。可以使用以下代码:
s = 'Enter speed in mph ';
sp_mph = input(s);
sp_yards_ph = sp_mph*1760;
sp_inch_ph = sp_yards_ph*36;
sp_cm_ph = sp_inch_ph*2.54;
sp_m_ph = sp_cm_ph/100;
sp_km_ph = sp_m_ph/1000;
disp(['Speed in km/h is ' num2str(sp_km_ph) ]);
操作步骤:
1. 运行代码,输入英里每小时的速度值。
2. 代码将自动进行单位转换,并输出千米每小时的速度值。
5.2 数学问题:函数零点求解
在数学建模中,我们可能需要求解函数的零点。例如,求解函数
f(x) = 2*x.^2-x.^3+sin(x)
的零点。可以使用以下代码:
function [f] = func(x)
f = 2*x.^2-x.^3+sin(x);
end
操作步骤:
1. 定义函数
func.m
。
2. 使用合适的零点求解方法,如二分法、牛顿法等,结合定义的函数进行求解。
6. 总结与展望
通过对各章节任务解决方案的详细介绍,我们可以看到MATLAB在数学计算、函数处理、绘图等方面具有强大的功能。在实际应用中,我们可以根据具体问题选择合适的方法和代码,同时要注意代码的正确性和效率。
未来,随着科学技术的不断发展,MATLAB的应用场景将更加广泛。我们可以进一步探索MATLAB在机器学习、数据分析、图像处理等领域的应用,不断提升自己的编程能力和解决实际问题的能力。
7. 流程图示例
以下是一个简单的MATLAB代码执行流程图,展示了代码输入、处理和输出的基本过程。
graph TD;
A[输入代码] --> B[语法检查];
B -- 无错误 --> C[代码执行];
B -- 有错误 --> D[错误处理];
D --> A;
C --> E[结果输出];
这个流程图清晰地展示了MATLAB代码执行的基本流程,从输入代码开始,经过语法检查,若有错误则进行错误处理,无错误则执行代码并输出结果。通过这个流程图,我们可以更好地理解代码执行过程,有助于我们在编写代码时及时发现和解决问题。
MATLAB任务解决方案精讲
超级会员免费看
1768

被折叠的 条评论
为什么被折叠?



