文档库 最新最全的文档下载
当前位置:文档库 › MATLAB解析GPS数据程序

MATLAB解析GPS数据程序

MATLAB解析GPS数据程序
MATLAB解析GPS数据程序

% 注:本程序可直接在MATLAB 2017a 中运行

%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码

%本脚本文件的前面几行代码是要设置的一些参数

%默认使用COM3(需视情况修改)

%波特率设为GPS模块默认的38400

%下面为程序源码

clear

num_execute = 100; % 执行次数

num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)

Timedelay = 0.2; % 用于延时读取串口数据

BaudRate = 38400; % 读取数据的波特率

Terminator = 'CR';

num_MaxTry = 5; %打开串口的最多尝试次数

BytesAvailableFcnCount = 1000;

%% 设置参数

% delete(instrfindall); % 串口打开失败时使用此句

% delete(s);clear s % 串口打开失败时使用此句

serial3 = serial('COM3');

% 串口设置

serial3.BytesAvailableFcnMode = 'byte';

% serial3.InputBufferSize = 38400; % 输出波特率

serial3.BaudRate = BaudRate; % 读入波特率

% serial3.OutputBufferSize = 1024;

serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;

serial3.ReadAsyncMode = 'continuous';

serial3.Terminator = Terminator;

%% 打开串口

count_opentimes = 1;

while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口

count_opentimes = count_opentimes+1;

end

if contains(serial3.status,'open') < 1

disp('open failed!');

return

end

%% 读取并处理数据

% 初始化

GPS_Data = GPS_Init();

while(num_execute > 0)

GPS_DataStrs = fread(serial3,num_SingleRead,'char'); %一次读出10个字符 GPS_DataStrs = reshape(GPS_DataStrs,1,[]);

GPS_DataStrs = split_str2strs(GPS_DataStrs);

GPS_Data_tmp = get_GPS_specificData(GPS_DataStrs);

GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp);

show_GPS_Data(GPS_Data);

pause(Timedelay); % 延时

num_execute = num_execute-1;

end

% fprintf(s,'abcd'); %给串口的发送数据

% fscanf(s); %从串口的接收缓存读数据

%% 关闭串口并删除相关数据

fclose(serial3); %关闭串口

delete(serial3);

clear serial3

%%

%将字符串根据'\r\n'划分成多个子字符串,同时去掉首尾无用的残余字符串function out_strs = split_str2strs(StrData)

if contains(class(StrData),'char')

uint8(StrData);

end

record = get_pos_enterflag(StrData);

if StrData(1) == uint8('$') %开头为'$'的情况

flag_start = 1;

else

if size(record,2) > 0

flag_start = record(1)+2;

else

out_strs = cell(0,0);

return

end

end

if StrData(end) == 13

flag_end = length(StrData)-1;

else

if size(record,2) > 0

flag_end = record(end)-1;

end

end

if flag_start >= flag_end

out_strs = cell(0,0);

return

end

StrData = StrData(flag_start:flag_end); % 截取有效数据,方便下面划分子字符串 record = get_pos_enterflag(StrData);

num_strs = size(record,2)+1;

out_strs = cell(num_strs,1);

if num_strs > 1

out_strs{1,1} = char(StrData(1:record(1)-1));

if num_strs == 2

out_strs{num_strs,1} = char(StrData(record(1)+2:end));

else

for i = 2 : num_strs-1

out_strs{i,1} = char(StrData(record(i-1)+2:record(i)-1));

end

out_strs{num_strs,1} = char(StrData(record(i)+2:end));

end

else

out_strs{1,1} = char(StrData);

end

% 得到字符串中'\r\n'在字符串中的位置(实际为'\r'的位置)

function record = get_pos_enterflag(data)

record = []; % 记录回车符号位置

for ii = 1 : length(data)-1

if data(ii) == 13

if data(ii+1) == 10

record = [record,ii];

ii = ii+1;

end

end

end

end

end

% 得到具体GPS结构体数据

function GPS_Data_tmp = get_GPS_specificData(StrsData)

GPS_Data_tmp = [];

num_str = size(StrsData,1);

for i = 1 : num_str

str_tab = StrsData{i,1};

if contains(str_tab,'GGA') > 0

GPS_Data_tmp = GNGGA(str_tab);

elseif contains(str_tab,'GSA') > 0

GPS_Data_tmp = GNGSA(str_tab);

elseif contains(str_tab,'GSV') > 0

GPS_Data_tmp = GNGSV(str_tab);

elseif contains(str_tab,'RMC') > 0

GPS_Data_tmp = GNRMC(str_tab);

elseif contains(str_tab,'VTG') > 0

GPS_Data_tmp = GNVTG(str_tab);

elseif contains(str_tab,'GLL') > 0

GPS_Data_tmp = GNGLL(str_tab);

end

end

end

% GPS字符串解析

function GPS_Data_tmp = GNGGA(str_tab)

index = strfind(str_tab,',');

count = 1;

Time = str_tab(index(count)+1:index(count+1)-1);count=count+1;

Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.GPSState = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.SatelliteNum = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.altitude = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

% other = str_tab(index(count)+1:end);

% 进一步处理

GPS_Data_tmp.Time.hour = Time(1:2);

GPS_Data_tmp.Time.min = Time(3:4);

GPS_Data_tmp.Time.sec = Time(5:6);

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = Time(8:10);

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.degree = Latitude(1:2); % 纬度

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.min = Latitude(3:4);

tmp = str2double(Latitude(6:9));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000);

GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度

GPS_Data_tmp.Longitude.min = Longitude(4:5);

tmp = str2double(Longitude(7:10));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000);

% UTC时间转换为北京时间

hour = GPS_Data_tmp.Time.hour;

if str2num(hour)+8 >= 24

GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24);

else

GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8);

end

end

function GPS_Data_tmp = GNGSA(str_tab)

index = strfind(str_tab,',');

count = 1;

GPS_Data_tmp.LocationMode = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.CurState = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.PRN = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.PDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.VDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;

% other = str_tab(index(count)+1:end);

end

function GPS_Data_tmp = GNGSV(str_tab)

% 此语句为与卫星有关的信息(包括卫星方位,卫星编号)

% 暂时用不着,不处理

GPS_Data_tmp = [];

end

function GPS_Data_tmp = GNRMC(str_tab)

index = strfind(str_tab,',');

count = 1;

Time = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.speed = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.TrueDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Date = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.MagneticAngle = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.MagneticDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

% other = str_tab(index(count)+1:end);

% 进一步处理

GPS_Data_tmp.Time.hour = Time(1:2);

GPS_Data_tmp.Time.min = Time(3:4);

GPS_Data_tmp.Time.sec = Time(5:6);

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = Time(8:10);

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.degree = Latitude(1:2); % 纬度

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.min = Latitude(3:4);

tmp = str2double(Latitude(6:9));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000);

GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度

GPS_Data_tmp.Longitude.min = Longitude(4:5);

tmp = str2double(Longitude(7:10));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000);

GPS_Data_tmp.DATE.day = Date(1:2);

GPS_Data_tmp.DATE.month = Date(3:4);

GPS_Data_tmp.DATE.year = Date(5:6);

% UTC时间转换为北京时间

hour = GPS_Data_tmp.Time.hour;

if str2num(hour)+8 >= 24

GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24);

else

GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8);

end

end

function GPS_Data_tmp = GNVTG(str_tab)

index = strfind(str_tab,',');

count = 1;

GPS_Data_tmp.TrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.ReferenceTrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.RelativeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.ReferenceRelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.step = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.stepflag = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

GPS_Data_tmp.velocity = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

% other = str_tab(index(count)+1:end);

end

function GPS_Data_tmp = GNGLL(str_tab)

index = strfind(str_tab,',');

count = 1;

Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

Date = str_tab(index(count)+1:index(count+1)-1);count=count+1;

GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-

1);count=count+1;

% other = str_tab(index(count)+1:end);

% 进一步处理

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.degree = Latitude(1:2); % 纬度

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.min = Latitude(3:4);

tmp = str2double(Latitude(6:9));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度

GPS_Data_tmp.Longitude.min = Longitude(4:5);

tmp = str2double(Longitude(7:10));

tmp = tmp*6/1000; % tmp = tmp/10000*60;

GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));

GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.DATE.day = Date(1:2);

GPS_Data_tmp.DATE.month = Date(3:4);

GPS_Data_tmp.DATE.year = Date(5:6);

end

% 更新获取到的相关数据

function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)

% 用不到的数据可以注释掉

if isfield(GPS_Data_tmp,'Time') == 1

GPS_Data.Time.hour = GPS_Data_tmp.Time.hour;

GPS_Data.Time.min = GPS_Data_tmp.Time.min;

GPS_Data.Time.sec = GPS_Data_tmp.Time.sec;

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec;

end

if isfield(GPS_Data_tmp,'DATE') == 1

GPS_Data.DATE.day = GPS_Data_tmp.DATE.day;

GPS_Data.DATE.month = GPS_Data_tmp.DATE.month;

GPS_Data.DATE.year = GPS_Data_tmp.DATE.year;

end

if isfield(GPS_Data_tmp,'Latitude') == 1

GPS_https://www.wendangku.net/doc/f36708688.html,titude.degree = GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.degree;

GPS_https://www.wendangku.net/doc/f36708688.html,titude.min = GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.min;

GPS_https://www.wendangku.net/doc/f36708688.html,titude.sec = GPS_Data_https://www.wendangku.net/doc/f36708688.html,titude.sec;

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec;

end

if isfield(GPS_Data_tmp,'LatitudeDir') == 1

GPS_https://www.wendangku.net/doc/f36708688.html,titudeDir = GPS_Data_https://www.wendangku.net/doc/f36708688.html,titudeDir;

end

if isfield(GPS_Data_tmp,'Longitude') == 1

GPS_Data.Longitude.degree = GPS_Data_tmp.Longitude.degree; GPS_Data.Longitude.min = GPS_Data_tmp.Longitude.min;

GPS_Data.Longitude.sec = GPS_Data_tmp.Longitude.sec;

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = GPS_Data_https://www.wendangku.net/doc/f36708688.html,lisec; end

if isfield(GPS_Data_tmp,'LongitudeDir') == 1

GPS_Data.LongitudeDir = GPS_Data_tmp.LongitudeDir;

end

if isfield(GPS_Data_tmp,'GPSState') == 1

GPS_Data.GPSState = GPS_Data_tmp.GPSState;

end

if isfield(GPS_Data_tmp,'SatelliteNum') == 1

GPS_Data.SatelliteNum = GPS_Data_tmp.SatelliteNum;

end

if isfield(GPS_Data_tmp,'speed') == 1

GPS_Data.speed = GPS_Data_tmp.speed;

end

if isfield(GPS_Data_tmp,'velocity') == 1

GPS_Data.velocity = GPS_Data_tmp.velocity;

end

if isfield(GPS_Data_tmp,'LocationState') == 1

GPS_Data.LocationState = GPS_Data_tmp.LocationState;

end

if isfield(GPS_Data_tmp,'altitude') == 1

GPS_Data.altitude = GPS_Data_tmp.altitude;

end

if isfield(GPS_Data_tmp,'CurState') == 1

GPS_Data.CurState = GPS_Data_tmp.CurState;

end

if isfield(GPS_Data_tmp,'LocationMode') == 1

GPS_Data.LocationMode = GPS_Data_tmp.LocationMode; end

if isfield(GPS_Data_tmp,'HDOP') == 1

GPS_Data.HDOP = GPS_Data_tmp.HDOP;

end

if isfield(GPS_Data_tmp,'VDOP') == 1

GPS_Data.VDOP = GPS_Data_tmp.VDOP;

end

if isfield(GPS_Data_tmp,'PDOP') == 1

GPS_Data.PDOP = GPS_Data_tmp.PDOP;

end

if isfield(GPS_Data_tmp,'TrueDir') == 1

GPS_Data.TrueDir = GPS_Data_tmp.TrueDir;

end

if isfield(GPS_Data_tmp,'MagneticAngle') == 1

GPS_Data.MagneticAngle = GPS_Data_tmp.MagneticAngle; end

if isfield(GPS_Data_tmp,'MagneticDir') == 1

GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir;

if isfield(GPS_Data_tmp,'ReferenceTrueDir') == 1

GPS_Data.ReferenceTrueDir = GPS_Data_tmp.ReferenceTrueDir;

end

if isfield(GPS_Data_tmp,'RelativeDir') == 1

GPS_Data.RelativeDir = GPS_Data_tmp.RelativeDir;

end

if isfield(GPS_Data_tmp,'ReferenceRelativeDir') == 1

GPS_Data.ReferenceRelativeDir = GPS_Data_tmp.ReferenceRelativeDir;

end

if isfield(GPS_Data_tmp,'step') == 1

GPS_Data.step = GPS_Data_tmp.step;

end

if isfield(GPS_Data_tmp,'stepflag') == 1

GPS_Data.stepflag = GPS_Data_tmp.stepflag;

end

if isfield(GPS_Data_tmp,'PRN') == 1

GPS_Data.PRN = GPS_Data_tmp.PRN;

end

end

% 显示相关GPS数据

function show_GPS_Data(GPS_Data)

DataAndTime = sprintf('20%02s-%02s-%02s %02s:%02s:%02s:%03s',...

GPS_Data.DATE.year,GPS_Data.DATE.month,GPS_Data.DATE.day,...

GPS_Data.Time.hour,GPS_Data.Time.min,GPS_Data.Time.sec,GPS_https://www.wendangku.net/doc/f36708688.html,lisec); Location = sprintf(' %s:%02s°%02s′%03s″%04s,%s:%02s°%02s′%03s″%04s',...

GPS_https://www.wendangku.net/doc/f36708688.html,titudeDir,GPS_https://www.wendangku.net/doc/f36708688.html,titude.degree,GPS_https://www.wendangku.net/doc/f36708688.html,titude.min,GPS_https://www.wendangku.net/doc/f36708688.html,titu de.sec,GPS_https://www.wendangku.net/doc/f36708688.html,lisec,...

GPS_Data.LongitudeDir,GPS_Data.Longitude.degree,GPS_Data.Longitude.min,GPS_Data. Longitude.sec,GPS_https://www.wendangku.net/doc/f36708688.html,lisec);

% Others = sprintf('

GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s',...

%

GPS_Data.GPSState,GPS_Data.SatelliteNum,GPS_Data.speed,GPS_Data.velocity,GPS_Dat a.LocationState);

% show_Message_str(strcat(DataAndTime,Location,Others));

show_Message_str(strcat(DataAndTime,Location));

end

% 初始化GPS数据结构体

function GPS_Data = GPS_Init()

GPS_Data.Time.hour = '0';

GPS_Data.Time.min = '0';

GPS_Data.Time.sec = '0';

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = '0';

GPS_Data.DATE.day = '29';

GPS_Data.DATE.month = '8';

GPS_Data.DATE.year = '18';

GPS_https://www.wendangku.net/doc/f36708688.html,titude.degree = '0'; % 纬度

GPS_https://www.wendangku.net/doc/f36708688.html,titude.min = '0';

GPS_https://www.wendangku.net/doc/f36708688.html,titude.sec = '0';

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = '0';

GPS_https://www.wendangku.net/doc/f36708688.html,titudeDir = 'N';

GPS_Data.Longitude.degree = '0'; % 经度

GPS_Data.Longitude.min = '0';

GPS_Data.Longitude.sec = '0';

GPS_https://www.wendangku.net/doc/f36708688.html,lisec = '0';

GPS_Data.LongitudeDir = 'E';

GPS_Data.GPSState = '0'; % GPS状态,0:未定位;1:无差分定位;2:带差分定位;3:无效GPS;6:正在估算

GPS_Data.SatelliteNum = '0'; % 可用卫星数目

GPS_Data.speed = '0';

GPS_Data.velocity = '0';

GPS_Data.LocationState = 'V';

GPS_Data.altitude = '0'; % 海拔高度

GPS_Data.CurState = '1'; % 当前状态,1:无定位信息;2:2D;3:3D

GPS_Data.LocationMode = 'A'; % 定位模式,'A':自动,'M':手动

GPS_Data.HDOP = '0.5'; % 水平精度因子

GPS_Data.VDOP = '0.5'; % 垂直精度因子

GPS_Data.PDOP = '0.5'; % 综合位置精度因子

GPS_Data.TrueDir = '0'; % 方位角

GPS_Data.MagneticAngle = '0'; % 磁偏角

GPS_Data.MagneticDir = 'E'; % 磁偏角参考方向,E/W(东西经)

GPS_Data.ReferenceTrueDir = 'T'; % 真实方向的参考方向,T:正北参照系

GPS_Data.RelativeDir = '0'; % 相对方向

GPS_Data.ReferenceRelativeDir = 'M'; % M:磁北参照系

GPS_Data.step = '0'; % 步长

GPS_Data.stepflag = 'N';

GPS_Data.PRN = '01'; % 正在使用的卫星PRN码编号

end

% 可实现静态显示输出内容(防止输出内容不同换行)

function show_Message_str(strData)

persistent CurMessage;

if isempty(CurMessage)

CurMessage = '';

end

fprintf(1,repmat('\b',1,numel(CurMessage))); fprintf(1,'%s',strData);

CurMessage = strData;

end

matlab在统计数据的描述性分析的应用

统计数据的描述性分析 一、实验目的 熟悉在matlab中实现数据的统计描述方法,掌握基本统计命令:样本均值、样本中位数、样本标准差、样本方差、概率密度函数pdf、概率分布函数df、随机数生成rnd。 二、实验内容 1 、频数表和直方图 数据输入,将你班的任意科目考试成绩输入 >> data=[91 78 90 88 76 81 77 74]; >> [N,X]=hist(data,5) N = 3 1 1 0 3 X = 75.7000 79.1000 82.5000 85.9000 89.3000 >> hist(data,5)

2、基本统计量 1) 样本均值 语法: m=mean(x) 若x 为向量,返回结果m是x 中元素的均值; 若x 为矩阵,返回结果m是行向量,它包含x 每列数据的均值。 2) 样本中位数 语法: m=median(x) 若x 为向量,返回结果m是x 中元素的中位数; 若x 为矩阵,返回结果m是行向量,它包含x 每列数据的中位数3) 样本标准差 语法:y=std(x) 若x 为向量,返回结果y 是x 中元素的标准差; 若x 为矩阵,返回结果y 是行向量,它包含x 每列数据的标准差

std(x)运用n-1 进行标准化处理,n是样本的个数。 4) 样本方差 语法:y=var(x); y=var(x,1) 若x 为向量,返回结果y 是x 中元素的方差; 若x 为矩阵,返回结果y 是行向量,它包含x 每列数据的方差 var(x)运用n-1 进行标准化处理(满足无偏估计的要求),n 是样本的个数。var(x,1)运用n 进行标准化处理,生成关于样本均值的二阶矩。 5) 样本的极差(最大之和最小值之差) 语法:z= range(x) 返回结果z是数组x 的极差。 6) 样本的偏度 语法:s=skewness(x) 说明:偏度反映分布的对称性,s>0 称为右偏态,此时数据位于均值右边的比左边的多;s<0,情况相反;s 接近0 则可认为分布是对称的。 7) 样本的峰度 语法:k= kurtosis(x) 说明:正态分布峰度是3,若k 比3 大得多,表示分布有沉重的尾巴,即样本中含有较多远离均值的数据,峰度可以作衡量偏离正态分布的尺度之一。 >> mean(data) ,

数值积分的matlab实现

实验10 数值积分 实验目的: 1.了解数值积分的基本原理; 2.熟练掌握数值积分的MATLAB 实现; 3.会用数值积分方法解决一些实际问题。 实验内容: 积分是数学中的一个基本概念,在实际问题中也有很广泛的应用。同微分一样,在《微积分》中,它也是通过极限定义的,由于实际问题中遇到的函数一般都以列表形式给出,所以常常不能用来直接进行积分。此外有些函数虽然有解析式,但其原函数不是初等函数,所以仍然得不到积分的精确值,如不定积分?1 0 d sin x x x 。这时我们一般考虑用数值方法计算其 近似值,称为数值积分。 10.1 数值微分简介 设函数()y f x =在* x 可导,则其导数为 h x f h x f x f h ) ()(lim )(**0* -+='→ (10.1) 如果函数()y f x =以列表形式给出(见表10-1),则其精确值无法求得,但可由下式求得其近似值 h x f h x f x f ) ()()(*** -+≈' (10.2) 表 10-1 一般的,步长h 越小,所得结果越精确。(10.2)式右端项的分子称为函数()y f x =在 *x 的差分,分母称为自变量在*x 的差分,所以右端项又称为差商。数值微分即用差商近似 代替微商。常用的差商公式为: 000()() ()2f x h f x h f x h +--'≈ (10.3) h y y y x f 243)(2 100-+-≈ ' (10.4)

h y y y x f n n n n 234)(12+-≈ '-- (10.5) 其误差均为2 ()O h ,称为统称三点公式。 10.2 数值微分的MATLAB 实现 MATLAB 提供了一个指令求解一阶向前差分,其使用格式为: dx=diff(x) 其中x 是n 维数组,dx 为1n -维数组[]21321,, ,n x x x x x x ---,这样基于两点的数值导 数可通过指令diff(x)/h 实现。对于三点公式,读者可参考例1的M 函数文件diff3.m 。 例1 用三点公式计算()y f x =在=x 1.0,1.2,1.4处的导数值,()f x 的值由下表给 解:建立三点公式的M 函数文件diff3.m 如下: function f=diff3(x,y) n=length(x);h=x(2)-x(1); f(1)=(-3*y(1)+4*y(2)-y(3))/(2*h); for j=2:n-1 f(j)=(y(j+1)-y(j-1))/(2*h); end f(n)=(y(n-2)-4*y(n-1)+3*y(n))/(2*h); 在MATLAB 指令窗中输入指令: x=[1.0,1.1,1.2,1.3,1.4];y=[0.2500,0.2268,0.2066,0.1890,0.1736];diff3(x,y) 运行得各点的导数值为:-0.2470,-0.2170,-0.1890,-0.1650,-0.0014。所以()y f x =在=x 1.0,1.2,1.4处的导数值分别为-0.2470,-0.1890和-0.0014。 对于高阶导数,MATLAB 提供了几个指令借助于样条函数进行求导,详细使用步骤如下: step1:对给定数据点(x,y ),利用指令pp=spline(x,y),获得三次样条函数数据pp ,供后面ppval 等指令使用。其中,pp 是一个分段多项式所对应的行向量,它包含此多项式的阶数、段数、节点的横坐标值和各段多项式的系数。 step2:对于上面所求的数据向量pp ,利用指令[breaks,coefs,m,n]=unmkpp(pp)进行处理,生成几个有序的分段多项式pp 。 step3:对各个分段多项式pp 的系数,利用函数ppval 生成其相应导数分段多项式的系数,再利用指令mkpp 生成相应的导数分段多项式 step4:将待求点xx 代入此导数多项式,即得样条导数值。 上述过程可建立M 函数文件ppd.m 实现如下: function dy=ppd(pp) [breaks,coefs,m]=unmkpp(pp);

【数学建模学习】Matlab的数值积分

Matlab 的数值积分问题 (1)求和命令sum 调用格式. 如果x 是向量,则sum(x) 给出x 的各个元素的累加和;如果x 是矩阵,则sum(x)是一个元素为x 的每列列和的行向量. 例3.1 调用命令sum 求向量x 的各个元素的累加和。 解:输入 x=[1,2,3,4,5,6,7,8,9,10]; sum(x) 得到 ans=55 例3.2 调用命令sum 求矩阵x 的各列元素的累加和。 解:输入 x=[1,2,3;4,5,6;7,8,9] x= 1 2 3 4 5 6 7 8 9 sum(x) 得到 ans=12 15 18 2.定积分的概念. 定积分是一个积分和的极限. 例如取x e x f =)(,求定积分?10dx e x 的近似值。 积分区间为[0,1],等距划分为20个子区间, x=linspace(0,1,21); 选取每个子区间的端点,并计算端点处的函数值. y=exp(x); 取区间的左端点处的函数值乘以区间长度全部加起来. y1=y(1:20); s1=sum(y1)/20 s1=1.6757 s1可作为定积分?10dx e x 的近似值。 若选取右端点: y2=y(2:21); s2=sum(y2)/20 s2=1.7616 s2也可以作为定积分?10dx e x 的近似值。 下面我们画出图象. plot(x,y);hold on for i=1:20 fill([x(i),x(i+1),x(i+1),x(i),x(i)],[0,0,y(i),y(i),0],'b')

end 如果选取右端点,则可画出图象. for i=1:20 fill([x(i),x(i+1),x(i+1),x(i),x(i)],[0,0,y(i+1),y(i+1),0],'b') hold on end plot(x,y,'r') 在上边的语句中,for … end 是循环语句,执行语句体内的命令20次,fill 命令可以填充多边形,在本例中,用的是兰色(blue)填充. 可试取50个子区间看一看结果怎样.下面按等分区间计算。 syms k n s=symsum(exp(k/n)/n,k,1,n); limit(s,n,inf) 得结果 ans=exp(1)-1 3.计算定积分 例3.6 计算?10dx e x . 解:输入命令: syms x; int(exp(x),0,1) 得结果 ans=exp(1)-1. 这与我们上面的运算结果是一致的. ⒈ 由给定数据进行梯形求积 假设已经建立起向量T N T N y y y y x x x x ],,,[,],,,[2121 ==,则可用以下语句进行梯形求积: sum((2*y(1:end-1,:)+diff(y)).*diff(x))/2 MATLAB 提供的trapz()函数也可直接用梯形法求解积分问题,该函数调用格式为 S=trapz(x,y) [例1-6-17] 试用梯形法求出),0(π∈x 区间内,函数sin(x),cos(x),sin(x/2)的定积分值。 [求解] >> x1=[0:pi/30:pi]'; y=[sin(x1) cos(x1) sin(x1/2)]; x=[x1 x1 x1]; S=sum((2*y(1:end-1,:)+diff(y)).*diff(x))/2 >> S1=trapz(x1,y) [例1-6-18] 用定步长方法求解积分?2 /30)15cos(πdx x 。 [求解] 鉴于求解区域内被积函数有很强的振荡,可先用下述语句绘制被积函数的曲线。 >> x=[0:0.01:3*pi/2,3*pi/2]; y=cos(15*x); plot(x,y) 采用不同的步距,可分别得到积分近似结果。 >> syms x, A=int(cos(15*x),0,3*pi/2) % 求理论值 >> h0=[0.1,0.01,0.001,0.0001,0.00001,0.000001]; v=[]

Matlab对采样数据进行频谱分析

使用Matlab对采样数据进行频谱分析 1、采样数据导入Matlab 采样数据的导入至少有三种方法。 第一就是手动将数据整理成Matlab支持的格式,这种方法仅适用于数据量比较小的采样。 第二种方法是使用Matlab的可视化交互操作,具体操作步骤为:File --> Import Data,然后在弹出的对话框中找到保存采样数据的文件,根据提示一步一步即可将数据导入。这种方法适合于数据量较大,但又不是太大的数据。据本人经验,当数据大于15万对之后,读入速度就会显著变慢,出现假死而失败。 第三种方法,使用文件读入命令。数据文件读入命令有textread、fscanf、load 等,如果采样数据保存在txt文件中,则推荐使用 textread命令。如 [a,b]=textread('data.txt','%f%*f%f'); 这条命令将data.txt中保存的数据三个三个分组,将每组的第一个数据送给列向量a,第三个数送给列向量b,第二个数据丢弃。命令类似于C语言,详细可查看其帮助文件。文件读入命令录入采样数据可以处理任意大小的数据量,且录入速度相当快,一百多万的数据不到20秒即可录入。强烈推荐! 2、对采样数据进行频谱分析 频谱分析自然要使用快速傅里叶变换FFT了,对应的命令即 fft ,简单使用方法为:Y=fft(b,N),其中b即是采样数据,N为fft数据采样个数。一般不指定N,即简化为Y=fft(b)。Y即为FFT变换后得到的结果,与b的元素数相等,为复数。以频率为横坐标,Y数组每个元素的幅值为纵坐标,画图即得数据b的幅频特性;以频率为横坐标,Y数组每个元素的角度为纵坐标,画图即得数据b的相频特性。典型频谱分析M程序举例如下: clc fs=100; t=[0:1/fs:100]; N=length(t)-1;%减1使N为偶数 %频率分辨率F=1/t=fs/N p=1.3*sin(0.48*2*pi*t)+2.1*sin(0.52*2*pi*t)+1.1*sin(0.53*2*pi*t)... +0.5*sin(1.8*2*pi*t)+0.9*sin(2.2*2*pi*t); %上面模拟对信号进行采样,得到采样数据p,下面对p进行频谱分析 figure(1) plot(t,p); grid on title('信号 p(t)'); xlabel('t') ylabel('p')

单片机解析GPS数据

三、单片机解读GPS信息的程序设计 用单片机解读GPS信息是GPS模块使用最重要的环节,由于汲设到产品的保密问题,这里只介绍时间的处理方法,而方位、速度的处理方法不做介绍,但通过时间的处理方法,同样可以处理方位、速度。 1、获取GPS模块的输出信息 由于GPS模块每秒输出一次:$GPGGA 、$GPGSA、$GPGSV、$GPRMC数据。速率慢,因此必须采用中断方式接收!(采用查询会造成数据丢失),而且单片机只需要处理$GPRMC信息,即可得到时间、方位、速度。程序采用C51编制,在Keil C中编译! code unsigned char GPS_ASC[]="$GPRMC" ; //定义特征字符串 unsigned char idata RsBuf[60]; //********************************************************** //读取GPS模块串口数据, 采用中断方式 void GetRs232_Data() interrupt 4 { unsigned char i; unsigned int j; if (RI){ RI=0; RsBuf[0]=SBUF; if (RsBuf[0] =='$'){ //是GPS数据的开始,进入查询接收 for (i=1;i

Matlab大数据处理

Matlab大数据处理2:硬盘访问.mat文件 分类:Matlab Hack2013-09-08 20:16 146人阅读评论(0) 收藏举报Matlab程序中经常要访问.mat文件,通常在作法是用load函数直接加载.mat文件。如果.mat文件非常大,超过了系统可用内存的时候该怎么办呢?Matlab2013b为提供了matfile函数,matfile函数可以通过索引直接访问.mat文件中的Matlab变量,而无需将.mat文件加载入内存。 matfile有两种用法: m = matfile(filename),用文件名创建matfile对象,通过这个对象可以直接访问mat文件中的matlab变量。 m = matfile(filename,'Writable',isWritable),isWritable开启或关闭文件写操作。 使用示例: 1. 向mat文件中写入变量 x = magic(20); m = matfile('myFile.mat'); % 创建一个指向myFile.mat的matfile对象 m.x = x; % 写入x m.y(81:100,81:100) = magic(20); % 使用坐标索引

2. 加载变量 filename = 'topography.mat'; m = matfile(filename); topo = m.topo; %读取变量topo [nrows,ncols] = size(m,'stocks'); %读取stocks变量的size avgs = zeros(1,ncols); for idx = 1:ncols avgs(idx) = mean(m.stocks(:,idx)); end 3. 开启写权限 filename = 'myFile.mat'; m = matfile(filename,'Writable',true); 或者 m.Properties.Writable = true;

数值积分用matlab实现

数值积分用m a t l a b实 现

东北大学秦皇岛分校 数值计算课程设计报告 数值积分及Matlab实现 学院数学与统计学院 专业信息与计算科学 学号5133117 姓名楚文玉 指导教师张建波姜玉山 成绩 教师评语: 指导教师签字: 2015年07月14日

1 绪论 在科研计算中,经常会碰到一些很难用公式定理直接求出精确解的积分问题,对于这类问题,我们一般转化为数值积分问题,用计算机来实现求解问题. 1.1 课题的背景 对于定积分()b a f x dx ?在求某函数的定积分时,在一定条件下,虽然有牛顿-莱布里 茨公式()()()b a I f x dx F b F a ==-?可以计算定积分的值,但在很多情况下的原函数() f x 不易求出或非常复杂.被积函数的原函数很难用初等函数表达出来,例如 2 sin (),x x f x e x -= 等;有的函数()f x 的原函数()F x 存在,但其表达式太复杂,计算量太大,有的甚至无法有解析表达式.因此能够借助牛顿-莱布尼兹公式计算定积分的情形是不多的.另外,许多实际问题中的被积函数()f x 往往是列表函数或其他形式的非连续函数,对这类函数的定积分,也不能用不定积分方法求解,只能设法求其近似值.因此,探讨近似计算的数值积分方法是有明显的实际意义的,即有必要研究定积分的数值计算方法,以解决定积分的近似计算.而数值积分就是解决此类问题的一种有效的方法,它的特点是利用被积函数在一些节点上的信息求出定积分的近似值.微积分的发明是人类科学史上一项伟大的成就,在科学技术中,积分是经常遇到的一个重要计算环节数值积分是数学上重要的课题之一,是数值分析中重要的内容之一.随着计算机的出现,近几十年来,对于数值积分问题的研究已经成为一个很活跃的研究领域.现在,数值积分在计算机图形学,积分方程,工程计算,金融数学等应用科学领域都有着相当重要的应用,所以研究数值积分问题有着很重要的意义.国内外众多学者在数值积分应用领域也提出了许多新方法.在很多实际应用中,只能知道积分函数在某些特定点的取值,比如天气测量中的气温、湿度、气压等,医学测量中的血压、浓度等等.通过这个课题的研究,我们将会更好地掌握运用数值积分算法求出特殊积分函数的定积分的一些基本方法、理论基础;并且通过Matlab 软件编程的实现,应用于实际生活中. 1.2 课题的主要内容框架

MATLAB解析GPS数据程序

% 注:本程序可直接在MATLAB 2017a 中运行 %该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码 %本脚本文件的前面几行代码是要设置的一些参数 %默认使用COM3(需视情况修改) %波特率设为GPS模块默认的38400 %下面为程序源码 clear num_execute = 100; % 执行次数 num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据) Timedelay = ; % 用于延时读取串口数据 BaudRate = 38400; % 读取数据的波特率 Terminator = 'CR'; num_MaxTry = 5; %打开串口的最多尝试次数 BytesAvailableFcnCount = 1000; %% 设置参数 % delete(instrfindall); % 串口打开失败时使用此句 % delete(s);clear s % 串口打开失败时使用此句 serial3 = serial('COM3'); % 串口设置 = 'byte'; % = 38400; % 输出波特率 = BaudRate; % 读入波特率

% = 1024; = BytesAvailableFcnCount; = 'continuous'; = Terminator; %% 打开串口 count_opentimes = 1; while contains,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口 count_opentimes = count_opentimes+1; end if contains,'open') < 1 disp('open com failed!'); return end %% 读取并处理数据 % 初始化 GPS_Data = GPS_Init(); while(num_execute > 0) GPS_DataStrs = fread(serial3,num_SingleRead,'char'); %一次读出10个字符 GPS_DataStrs = reshape(GPS_DataStrs,1,[]); GPS_DataStrs = split_str2strs(GPS_DataStrs); GPS_Data_tmp = get_GPS_specificData(GPS_DataStrs);

数值积分算法与MATLAB实现

数值积分算法与MATLAB实现 本文从网络收集而来,上传到平台为了帮到更多的人,如果您需要使用本文档,请点击下载按钮下载本文档(有偿下载),另外祝您生活愉快,工作顺利,万事如意! 摘要:在求一些函数的定积分时,由于原函数十分复杂难以求出或用初等函数表达,导致积分很难精确求出,只能设法求其近似值,因此能够直接借助牛顿-莱布尼兹公式计算定积分的情形是不多的。数值积分就是解决此类问题的一种行之有效的方法。积分的数值计算是数值分析的一个重要分支;因此,探讨近似计算的数值积分方法是有着明显的实际意义的。本文从数值积分问题的产生出发,详细介绍了一些数值积分的重要方法。 本文较详细地介绍了牛顿-科特斯求积公式,以及为了提高积分计算精度的高精度数值积分公式,即龙贝格求积公式和高斯-勒让德求积公式。除了研究这些数值积分算法的理论外,本文还将这些数值积分算法在计算机上通过MATLAB软件编程实现,并通过实例用各种求积公式进行运算,分析比较了各种求积公式的计算误差。 【关键词】数值积分牛顿-科特斯求积公式高精度求积公式MATLAB软件

前言 对于定积分,在求某函数的定积分时,在一定条件下,虽然有牛顿-莱布里茨公式可以计算定积分的值,但在很多情况下的原函数不易求出或非常复杂。被积函数的原函数很难用初等函数表达出来,例如等;有的函数的原函数存在,但其表达式太复杂,计算量太大,有的甚至无法有解析表达式。因此能够借助牛顿-莱布尼兹公式计算定积分的情形是不多的。另外,许多实际问题中的被积函数往往是列表函数或其他形式的非连续函数,对这类函数的定积分,也不能用不定积分方法求解,只能设法求其近似值。因此,探讨近似计算的数值积分方法是有明显的实际意义的,即有必要研究定积分的数值计算方法,以解决定积分的近似计算。而数值积分就是解决此类问题的一种有效的方法,它的特点是利用被积函数在一些节点上的信息求出定积分的近似值。 微积分的发明是人类科学史上一项伟大的成就,在科学技术中,积分是经常遇到的一个重要计算环节。数值积分是数学上重要的课题之一,是数值分析中重要的内容之一,也是应用数学研究的重点。随着计算机的出现,近几十年来,对于数值积分问题的研究已经成为一个很活跃的研究领域。现在,数值积分在计算

第6章matlab数据分析与多项式计算_习题答案

第6章 MATLAB数据分析与多项式计算 习题6 一、选择题 1.设A=[1,2,3,4,5;3,4,5,6,7],则min(max(A))的值是()。B A.1 B.3 C.5 D.7 2.已知a为3×3矩阵,则运行mean(a)命令是()。B A.计算a每行的平均值 B.计算a每列的平均值 C.a增加一行平均值 D.a增加一列平均值 3.在MATLAB命令行窗口输入下列命令: >> x=[1,2,3,4]; >> y=polyval(x,1); 则y的值为()。 D A.5 B.8 C.24 D.10 4.设P是多项式系数向量,A为方阵,则函数polyval(P,A)与函数polyvalm(P,A)的值()。D A.一个是标量,一个是方阵 B.都是标量 C.值相等 D.值不相等 5.在MATLAB命令行窗口输入下列命令: >> A=[1,0,-2]; >> x=roots(A); 则x(1)的值为()。 C A.1 B.-2 C. D. 6.关于数据插值与曲线拟合,下列说法不正确的是()。A A.3次样条方法的插值结果肯定比线性插值方法精度高。 B.插值函数是必须满足原始数据点坐标,而拟合函数则是整体最接近原始数据点,而不一定要必须经过原始数据点。 C.曲线拟合常常采用最小二乘原理,即要求拟合函数与原始数据的均方误差达到极小。 D.插值和拟合都是通过已知数据集来求取未知点的函数值。 二、填空题 1.设A=[1,2,3;10 20 30;4 5 6],则sum(A)= ,median(A)= 。 [15 27 39],[4 5 6[ 2.向量[2,0,-1]所代表的多项式是。2x2-1 3.为了求ax2+bx+c=0的根,相应的命令是(假定a、b、c已经赋值)。为了

利用Matlab实现Romberg数值积分算法----系统建模与仿真结课作业

利用Matlab 实现Romberg 数值积分算法 一、内容摘要 针对于某些多项式积分,利用Newton —Leibniz 积分公式求解时有困难,可以采用数值积分的方法,求解指定精度的近似解,本文利用Matlab 中的.m 文件编写了复化梯形公式与Romberg 的数值积分算法的程序,求解多项式的数值积分,比较两者的收敛速度。 二、数值积分公式 1.复化梯形公式求解数值积分的基础是将区间一等分时的Newton —Cotes 求积公式: I =(x)[f(a)f(b)]2 b a b a f dx -≈ +? 其几何意义是,利用区间端点的函数值、与端点构成的梯形面积来近似(x)f 在区间[a,b]上的积分值,截断误差为: 3" (b a)()12 f η-- (a,b)η∈ 具有一次的代数精度,很明显,这样的近似求解精度很难满足计算的要求,因而,可以采用将积分区间不停地对分,当区间足够小的时候,利用梯形公式求解每一个小区间的积分近似值,然后将所有的区间加起来,作为被求函数的积分,可以根据计算精度的要求,划分对分的区间个数,得到复化梯形公式: I =1 1 (b a)(b a) (x)dx [f(a)f(b)2(a )]2n b a k k f f n n -=--≈+++∑? 其截断误差为:

2" (b a)h ()12 R f η--= (a,b)η∈ 2.Romberg 数值积分算法 使用复化的梯形公式计算的数值积分,其收敛速度比减慢,为此,采用Romberg 数值积分。其思想主要是,根据I 的近似值2n T 加上I 与2n T 的近似误差,作为新的I 的近视,反复迭代,求出满足计算精度的近似解。 用2n T 近似I 所产生的误差可用下式进行估算: 12221 ()3 n n n I T T T -?=-=- 新的I 的近似值: 122 n n j T T -=?+ j =(0 1 2 ….) Romberg 数值积分算法计算顺序 i=0 (1) 002T i=1 (2) 102T (3) 012T i=2 (4) 202T (5) 112T (6) 022T i=3 (7) 302T (8) 212T (9) 122T (10) 032T i=4 (11) 402T (12) 312T (13) 222T (14) 132T … … … … 其中,第一列是二阶收敛的,第二列是四阶收敛的,第三列是六阶收敛的,第四列是八阶收敛的,即Romberg 序列。

数值积分的算法比较及其MATLAB实现

编号: 审定成绩: 重庆邮电大学 毕业设计(论文) 设计(论文)题目:数值积分算法与MATLAB实现 学院名称:数理学院 学生姓名: 专业:数学与应用数学 班级: 学号: 指导教师: 答辩组负责人: 填表时间:年月 重庆邮电大学教务处制

摘要 在求一些函数的定积分时,由于原函数十分复杂难以求出或用初等函数表达,导致积分很难精确求出,只能设法求其近似值,因此能够直接借助牛顿-莱布尼兹公式计算定积分的情形是不多的。数值积分就是解决此类问题的一种行之有效的方法。积分的数值计算是数值分析的一个重要分支;因此,探讨近似计算的数值积分方法是有着明显的实际意义的。本文从数值积分问题的产生出发,详细介绍了一些数值积分的重要方法。 本文较详细地介绍了牛顿-科特斯求积公式,以及为了提高积分计算精度的高精度数值积分公式,即龙贝格求积公式和高斯-勒让德求积公式。除了研究这些数值积分算法的理论外,本文还将这些数值积分算法在计算机上通过MATLAB软件编程实现,并通过实例用各种求积公式进行运算,分析比较了各种求积公式的计算误差。 【关键词】数值积分牛顿-科特斯求积公式高精度求积公式MATLAB软件

ABSTRACT When the solution of the definite integral of some function values,because the original function is very complex and difficult to find the elementary function expression, the integral is difficult to accurately calculate, only managed to find the approximate value, and the case is small that allows to direct interface with the Newton - Leibniz formula to calculate the definite integral. Numerical integration is an effective method to solve such problems. The numerical integration is an important branch of numerical analysis; therefore, exploring the approximate calculation of the numerical integration method has obvious practical significance. This article departure from the numerical integration problem, described in detail some important numerical integration methods. This paper has introduced detail the Newton - Coates quadrature formula, and in order to improve the calculation accuracy of numerical integration formulas, More precise formulas have Romberg quadrature formulas and the Gauss - Legendre quadrature formula. In addition to the study of these numerical integration algorithm theory, the article also involve what these numerical integration algorithm be programmed by matlab software on the computer, and an example is calculated with a variety of quadrature formulas, finally analysis and comparison to various quadrature formulas calculation error. 【Key words】Numerical integration Newton-Cotes quadrature formula High-precision quadrature formula Matlab software

GPS-NMEA数据格式详解

NMEA data Table of Contents ?Introduction ?Hardware connection ?NMEA sentences ?Decodes of some position sentences ?Decodes of some navigation sentences ?Decodes of a few other sentences ?Decodes of some proprietary sentences ?Sample Streams Disclaimer This site is based on personal research and is believed to be accurate but there is no guarantee that any of the information is correct or suitable for any purpose. I have been told by the NMEA folks that my information is old and out of date. The current version of NMEA at the time I wrote this is 3.01 which is not described here. This site is for historical information and is not intended to be used for any official purpose. For official data please contact the NMEA web site. Please see the bottom of this article for the sources of this data. Introduction The National Marine Electronics Association (NMEA) has developed a specification that defines the interface between various pieces of marine electronic equipment. The standard permits marine electronics to send information to computers and to other marine equipment. A full copy of this standard is available for purchase at their web site. None of the information on this site comes from this standard and I do not have a copy. Anyone attempting to design anything to this standard should obtain an official copy. GPS receiver communication is defined within this specification. Most computer programs that provide real time position information understand and expect data to be in NMEA format. This data includes the complete PVT (position, velocity, time) solution computed by the GPS receiver. The idea of NMEA is to send a line of data called a sentence that is totally self contained and independent from other sentences. There are standard sentences for each device category and there is also the ability to define

[整理]Matlab积分.

一.数值积分的实现方法 1.变步长辛普生法 基于变步长辛普生法,MA TLAB给出了quad函数来求定积分。该函数的调用格式为:[I,n]=quad('fname',a,b,tol,trace) 其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0.001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。 例8-1 求定积分。 (1) 建立被积函数文件fesin.m。 function f=fesin(x) f=exp(-0.5*x).*sin(x+pi/6); (2) 调用数值积分函数quad求定积分。 [S,n]=quad('fesin',0,3*pi) S = 0.9008 n = 77 2.牛顿-柯特斯法 基于牛顿-柯特斯法,MA TLAB给出了quad8函数来求定积分。该函数的调用格式为:[I,n]=quad8('fname',a,b,tol,trace) 其中参数的含义和quad函数相似,只是tol的缺省值取10-6。?该函数可以更精确地求出定积分的值,且一般情况下函数调用的步数明显小于quad函数,从而保证能以更高的效率求出所需的定积分值。 (1) 被积函数文件fx.m。 function f=fx(x) f=x.*sin(x)./(1+cos(x).*cos(x)); (2) 调用函数quad8求定积分。 I=quad8('fx',0,pi) I = 2.4674 分别用quad函数和quad8函数求定积分的近似值,并在相同的积分精度下,比较函数的调用次数。 调用函数quad求定积分: format long; fx=inline('exp(-x)'); [I,n]=quad(fx,1,2.5,1e-10) I = 0.28579444254766 n = 65 调用函数quad8求定积分: format long; fx=inline('exp(-x)'); [I,n]=quad8(fx,1,2.5,1e-10) I = 0.28579444254754 n = 33

GPS数据分析

nmea数据如下: $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,00 00*77 $GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A* 54 $GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04 $GPGGA,121253.000,3937.3090,N,11611.6057,E,1,06,1.2,44.6,M,-5.7,M,,00 00*72 $GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D $GPGSV,3,3,10,29,07,074,,30,07,163,28*7D 注:NMEA0183格式以“$”开始,主要语句有GPGGA,GPRMC,GPGSA,GPGSV,GPVTG,GPZDA等 1、 GPS DOP and Active Satellites(GSA)当前卫星信息 $GPGSA,<1>,<2>,<3>,<4>,,,,,<12>,<13>,<14>, <15>,<16>,<17>,<18> <1>模式:M = 手动, A = 自动。 <2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。 <3>到<14>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息 (上面蓝色处,总共有12个)。 <15> PDOP位置精度因子(0.5~99.9) <16> HDOP水平精度因子(0.5~99.9) <17> VDOP垂直精度因子(0.5~99.9) <18> Checksum.(检查位). 2、 GPS Satellites in View(GSV)可见卫星信息 $GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8> <1> GSV语句的总数 <2> 本句GSV的编号 <3> 可见卫星的总数,00 至 12。 <4> 卫星编号, 01 至 32。 <5>卫星仰角, 00 至 90 度。 <6>卫星方位角, 000 至 359 度。实际值。 <7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。 <8>Checksum.(检查位). 第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。

matlab实现数值分析报告插值及积分

Matlab实现数值分析插值及积分 摘要: 数值分析(numerical analysis)是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,是数学的一个分支,它以数字计算机求解数学问题的理论和方法为研究对象。在实际生产实践中,常常将实际问题转化为数学模型来解决,这个过程就是数学建模。学习数值分析这门课程可以让我们学到很多的数学建模方法。 分别运用matlab数学软件编程来解决插值问题和数值积分问题。题目中的要求是计算差值和积分,对于问题一,可以分别利用朗格朗日插值公式,牛顿插值公式,埃特金逐次线性插值公式来进行编程求解,具体matlab代码见正文。编程求解出来的结果为:=+。 其中Aitken插值计算的结果图如下: 对于问题二,可以分别利用复化梯形公式,复化的辛卜生公式,复化的柯特斯公式编写程序来进行求解,具体matlab代码见正文。编程求解出来的结果为: 0.6932 其中复化梯形公式计算的结果图如下:

问题重述 问题一:已知列表函数 表格 1 分别用拉格朗日,牛顿,埃特金插值方法计算。 问题二:用复化的梯形公式,复化的辛卜生公式,复化的柯特斯公式计算积分,使精度小于5。 问题解决 问题一:插值方法 对于问题一,用三种差值方法:拉格朗日,牛顿,埃特金差值方法来解决。 一、拉格朗日插值法: 拉格朗日插值多项式如下: 首先构造1+n 个插值节点n x x x ,,,10 上的n 插值基函数,对任一点i x 所对应的插值基函数 )(x l i ,由于在所有),,1,1,,1,0(n i i j x j +-=取零值,因此)(x l i 有因子 )())(()(110n i i x x x x x x x x ----+- 。又因)(x l i 是一个次数不超过n 的多项式,所以只 可能相差一个常数因子,固)(x l i 可表示成: )())(()()(110n i i i x x x x x x x x A x l ----=+- 利用1)(=i i x l 得:

相关文档
相关文档 最新文档