Matlab实验(一)程序设计基础

  1. 数列{x_{n}}的定义是,x_1=0,x_2=1x_n=x_{n-1}+2x_{n-2}(n=3,4,....),用循环语句编程给出该数列的前40项(要求将结果用行向量x存储)。
%实验1.1.1

clear;
clc;

%初始化向量
x=[0 1];

%进行循环操作
for k=3:40
    x(k)=x(k-1)+2*x(k-2);
end

%输出行向量
disp(x);

2.请找出1到1000中满足a^2-100b=a的正整数a、b(1\leqslant a\leqslant 1000, 1\leqslant b\leqslant 1000)。编写函数依次返回行向量a和b(其中a(i), b(i)为第i组解),其中数组a中元素是递增排列。请先写出求解算法,再给出程序。

clear;
clc;
%存储结果向量sol的初始化
sol=[];
%初始化生成a、b
a=1:1000;
b=1:1000;

%循环操作
for i=1:1000
    for j=1:1000
        if a(i).^2-100*b(j)==a(i)
            sol=[sol;a(i) b(j)];
        end
    end
end

disp(sol);

3.

已知文件SH600004.mat包含了一个矩阵M.通过程序“load SH600004.mat”可以导入该文件存储的矩阵M.矩阵M存储了一只股票的交易数据.矩阵M的每行存储了一天的交易数据.以第i行为例说明矩阵M各列的含义如下:

  M(i,1) 日期,整数.如20210301表示矩阵M本行数据为2021年3月1日的交易数据.

  M(i,2) 开盘价,单位: 元

  M(i,3) 最高价,单位: 元

  M(i,4) 最低价,单位: 元

  M(i,5) 收盘价,单位: 元

  M(i,6) 成交额,单位: 元

  M(i,7) 成交量,单位: 股

请完成下列任务:

  1. 绘制出该只股票最近100个交易日内的收盘价曲线和散点图.
  2. 绘制出该只股票最近100个交易日的涨幅变化曲线和散点图.“涨幅”通过当日收盘价相对于前一个交易日的“收盘价”来计算.另外再用bar绘制涨幅的柱状图.
% 数据导入方式
d=load('SH600004.mat');
M=d.M;

%1.绘制出该只股票最近100个交易日内的收盘价(M(i,5))曲线和散点图.
%获取最近100天数据
S1=M(end-99:end,5);
x= 1:100;

figure(1);
subplot(1,2,1);
plot(x,S1,'r*');
xlabel('交易日/日');
ylabel('收盘价/元');
title('最近100个交易日的收盘价散点图');

subplot(1,2,2);
plot(x,S1,'r-',LineWidth=1);
xlabel('交易日/日');
ylabel('收盘价/元');
title('最近100个交易日的收盘价曲线图');

%绘制出该只股票最近100个交易日的涨幅变化曲线和散点图
%循环做差获得数据
S2=[S1(1)-M(end-100,5)];
for k=2:100
a(k)=S1(k)-S1(k-1);
S2=[S2,a(k)];
end

figure(2)
subplot(1,3,1);
plot(x,S2,'b*');
xlabel('交易日/日');
ylabel('收盘价/元');
title('最近100个交易日的涨幅变化散点图');

subplot(1,3,2);
plot(x,S2,'b-',LineWidth=1);
xlabel('交易日/日');
ylabel('收盘价/元');
title('最近100个交易日的涨幅变化曲线图');

subplot(1,3,3);
bar(x,S2,1,"grouped","magenta");
xlabel('交易日/日');
ylabel('收盘价/元');
title('最近100个交易日的涨幅变化柱状图');

4.背景:用长度为1200厘米的条材,分别截成长度为64厘米与85厘米的两种成品。

请用穷举法找出一根条材的所有切割方式,并给出每种切割方式的具体信息(包括余料长度)。说明:一根条材最多截出18根64厘米的成品,或14根85厘米的成品。

clc;
clear;
tot_len=1200; len1=85; len2=64;
mat=[];
n1=tot_len/len1;
for k1=1:n1
    k2=fix((tot_len-k1*len1)/len2);
    if k2>0
      remain=tot_len-k1*len1-k2*len2;
      mat=[mat;k1,k2,remain];
    end
end

disp(mat);

%输出最值时用
% [min_remain,index]=min(mat(:,3));
% qiege_sol=[len1,len2;mat(index,1:2)],
% min_remain

5.已知圆环面的方程如下

(\sqrt{x^2+y^2}-R)^2+z^2=r^2

其参数方程如下:

\left\{\begin{matrix} x=(R+rcosu)cosv\\ y=(R+rcosu)sinv\\ z=rsinu \end{matrix}\right.

其中u,v\epsilon [0,2\pi].下图为一个圆环面示意图.

 

现在该圆环面所包含的圆环体内内随机产生一些点,并用文本文件记录了这些点的坐标.该文件每行记录了一个点的坐标:第1个为x坐标,第2个为y坐标,第3个为z坐标.

现有两个圆环体的数据文件data_ring1.txtdata_ring2.txt.

第1个圆环体的中心在原点,第2个圆环体的中心不在原点.

请编程完成下列任务:

1.处理第1个圆环体文件 data_ring1.txt

1)估算圆环面方程中的参数R和r;

2)然后编程绘制出该圆环面.

2.处理第2个圆环体文件 data_ring2.txt

1)估算圆环面方程中的圆环体的中心,和参数R和r.

2)然后编程绘制出该圆环面.

clear;
clc;
%读取坐标数据
s1=load('data_ring1.txt');s2=load('data_ring2.txt');
x1=s1(:,1);y1=s1(:,2);z1=s1(:,3);
x2=s2(:,1);y2=s2(:,2);z2=s2(:,3);
%以上xyz均为读取到的文件中的坐标参数



%计算坐标均值,得到近似中心坐标
c1=mean(s1) 
c2=mean(s2)

%计算近似平均半径r和R
%关键是:中心到所有样本点的最小距离是R-r,最大距离是R+r
d1=[];
for i=1:100000
    d1=[d1;sqrt((c1(1)-x1(i)).^2+(c1(2)-y1(i)).^2+(c1(3)-z1(i)).^2)];
end

d2=[];
for j=1:100000
    d2=[d2;sqrt((c2(1)-x2(j)).^2+(c2(2)-y2(j)).^2+(c2(3)-z2(j)).^2)];
end

R1=0.5*(max(d1)+min(d1));
r1=0.5*(max(d1)-min(d1));

R2=0.5*(max(d2)+min(d2));
r2=0.5*(max(d2)-min(d2));


%得到参数方程坐标
u=0:0.01:2*pi;
v=0:0.01:2*pi;

[u,v]=meshgrid(u,v);
%本步骤很重要,使用mesh必用,目的是生成一个矩阵而非向量

subplot(1,2,1);
x11=(R1+r1.*cos(u)).*cos(v);
y11=(R1+r1.*cos(u)).*sin(v);
z11=r1.*sin(u);
mesh(x11,y11,z11);
%hold on;
%plot3(x1,y1,z1,'r*');
%注释掉的代码可以用于检验生成的立体图形是否合理
%去掉注释后图像中会标出所有样本点,可以发现样本点均在图形内

subplot(1,2,2);
x22=(R2+r2.*cos(u)).*cos(v)+c2(1);
y22=(R2+r2.*cos(u)).*sin(v)+c2(2);
z22=r2.*sin(u)+c2(3);
mesh(x22,y22,z22);
axis('square');
%hold on;
%plot3(x2,y2,z2,'r*');

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值