实验4 MATLAB 函数文件与程序流程的控制
Posted 从零开始的智障生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验4 MATLAB 函数文件与程序流程的控制相关的知识,希望对你有一定的参考价值。
实验4 MATLAB 函数文件与流程的控制
1. 简单问题应用举例
% 建立函数文件zyxsqrt.m,写入以下内容
function an=zyxsqrt(A)
if A<=0
disp('data error!');
an=-1;% 返回一个负值
return;
end
% 任取一个a0,如a0=1
a0=1;
r=1;%存放两次相邻迭代插值的绝对值,初值为1
while r>=1.0e-5
an=(a0+A/a0)/2;
r=abs(an-a0);
fprintf("每次逼近的值:%f,相邻迭代误差:%f\\n",a0,r);
a0=an;
end
fprintf("近似得到的值为:%f\\n",an);
end
在命令行窗口输入:an=zyxsqrt(2);
在命令行窗口输出:
每次逼近的值:1.000000,相邻迭代误差:0.500000
每次逼近的值:1.500000,相邻迭代误差:0.083333
每次逼近的值:1.416667,相邻迭代误差:0.002451
每次逼近的值:1.414216,相邻迭代误差:0.000002
近似得到的值为:1.414214
% 新建函数文件primeorcomposite.m
function [prime,m,n]=primeorcomposite(M)
format compact;
prime=1;% 如果是质数则返回1
if M<=0
fprintf("%d是个负数\\n",M);
m=0;n=0;prime=-1;
return;
end
for m=2:fix(sqrt(M)) % 在[2,fix(sqrt(M))]中进行判断
if mod(M,m)==0 % 利用取余函数进行判断
n=M/m;
prime=0;
fprintf("%d是合数(composite number)\\n两个因数分别是%d,%d\\n",M,m,n);
return;
end
end
m=1;n=M;
fprintf("%d是质数。\\n",M);
return;
end
在命令行窗口输入:[a,m,n]=primeorcomposite(50)
在命令行窗口输出:
50是合数(composite number)
两个因数分别是2,25
a =
0
m =
2
n =
25
% 我们先按常规方式解决,当导弹速度为飞机2倍时,拦截过程
format compact;
clear;close all;clc;
hold on;
OA=[0,0]; % 导弹(missile)坐标,OA0
OB=[0,100]; % 飞机坐标,OB0
d=norm(OB-OA);% 计算两点之间距离,norm返回向量v的欧几里得范数,也称为2-范数、向量模。
k=0;% k用来计数,共同飞行的单位时间。
v=1;dt=1;K=2;% 给定飞机速度v,单位时间1,速度关系系数即导弹速度是2K
while k<100
k=k+1;
%这里我们仅以创建OB1和OA1为例
OB=OB+[v*dt,0];% OB1=OB0+B0B1=(0,100)+(vdt,0)=(vdt,100);
% 单位时间,飞机的坐标变换,
% OB1=OB0+B0B1=(0,100)+(vdt,0)=(vdt,100);
% OB2=OB1+B1B2=(vdt,100)+(vdt,0)=(2vdt,100);
% 计算下,导弹纵横坐标的变化,
% OA1=OA0+A0A1=OA0+2vdt(OB1-OA0)/sqrt((vdt)^2+100^2)=(0,0)+2vdt(vdt-0,100-0)/sqrt((vdt)^2+100^2);
% OA2=OA1+A1A2=OA1+2vdt(OB2-OA1)/sqrt((vdt)^2+100^2);OB2已知,OA1已知,结果不言而喻。
% 可以看出上面复杂的一点的部分只有计算A1A2的部分,但是呢对于AnAn+1的计算用不用这么复杂呢?(其实也没有那么复杂)
% 不用,因为Matlab的 norm函数直接可以计算出两点之间距离,即向量模sqrt((vdt)^2+100^2),完全可以用函数norm(OBn+1-OAn)直接得出,
% 而OBn+1-OAn,可以直接算出,因而,过程其实十分简单。
% 然后计算下,飞机和导弹之间的距离
e=OB-OA;% OB1-OA0
d=norm(e); % ||A0B1||,但请注意这不是当前飞机与导弹之间的距离,这一步只是向量计算时的需要.
% 当前导弹还只是OA0位置,需要下面这一步计算出OA1,然后才能算出||A1B1||,飞机和导弹之间的实时距离
OA=OA+K*v*dt*e/d; % 根据上面的原理求出值,飞机当前位置OA1=OA0+2vdt(OB1-OA0)/||A0B1||
d=norm(OB-OA);
fprintf("第%d单位时间\\t飞机B(%.f,%.f)\\t导弹A(%f,%f)\\t二者实时距离%d\\n",k,OB(1),OB(2),OA(1),OA(2),d);
plot(OB(1),OB(2),'r.','markersize',15);% 画出即时飞机坐标
plot(OA(1),OA(2),'b.','markersize',15);% 画出即时导弹坐标
plot([OA(1),OB(1)],[OA(2),OB(2)]);
if d<0.5
fprintf("导弹和飞机相撞,\\n");
pause(5);
break;
end
pause(0.1);
end
第60单位时间 飞机B(60,100) 导弹A(53.824656,98.179925) 二者实时距离6.437977e+00
第61单位时间 飞机B(61,100) 导弹A(55.763262,98.671666) 二者实时距离5.402583e+00
第62单位时间 飞机B(62,100) 导弹A(57.719386,99.088292) 二者实时距离4.376627e+00
第63单位时间 飞机B(63,100) 导弹A(59.690228,99.428561) 二者实时距离3.358740e+00
第64单位时间 飞机B(64,100) 导弹A(61.672876,99.691443) 二者实时距离2.347491e+00
第65单位时间 飞机B(65,100) 导弹A(63.664330,99.876130) 二者实时距离1.341401e+00
第66单位时间 飞机B(66,100) 导弹A(65.661523,99.982049) 二者实时距离3.389522e-01
导弹和飞机相撞,
以上是关于实验4 MATLAB 函数文件与程序流程的控制的主要内容,如果未能解决你的问题,请参考以下文章