fianlexam

Version 1.0.0 (5.8 KB) by xiao li
its about my fianl exam

2 Downloads

Updated 1 Jul 2021

View License

%% 程序设计题(不能用自matlab带函数);
%% 运行程序时要输文件名()
%% 1.计算n!
%函数版
function [f]=call(n)
f=1;
for m=1:n
f=f*m; %for语句循环,m的范围是1~n,依次乘以1~n一直到最后一项
end
end
%% 2.计算y=1+2+3+...+n的值
function [y]=cal2(n)
y=0;
for m=1:n
y=y+m; % y从0开始,for语句循环,一直加到n结束
end
%% 3.求ax^2+bx+c=0方程的解
function [y] = cal3(a,b,c)
disp(['方程:',num2str(a),'*x^2+',num2str(b),'*x+',num2str(c)])
if a==0; %注意这里赋值要用“==”,否则程序不运行
x=-c/b;
disp(['根为:x=',num2str(x)]) % num2str将数值转化成字符串
elseif b^2+4*a*c>0
x1=(-b+sqrt(b^2-4*a*c))/(2*a);
x2=(-b-sqrt(b^2-4*a*c))/(2*a);
disp(['根为:x1=',num2str(x1), ' x2=',num2str(x2)])
elseif b^2+4*a*c==0;
x=-b/(2*a);
disp(['根为:x1=x2=',num2str(x)])
else
disp(['无解'])
end
end
%% 4.编写程序判定给定数m是否是素数
function [p] = cal4(m)
for a=2:m-1
if 0==rem(m,a) %求余函数
disp(['非素数'])
break;
elseif a==m-1 %这里必须要有一个条件,后面的结果是必然的,
%只要放上一个必然条件使之匹配成功即可
%其余的else都不会再尝试
disp(['素数'])
end
end
%% 5.编写程序求1000至9999之间的回文数,回文数是指正读和反读都一样的数
data=[];%建立一个空矩阵,以便存放数据
%回文数保持第一位与第四位相同,第二位与第三位相同
clc;clear;
result=[]
for i=1000:1000:9999;
j=0:9;
n=i+j*100+j*10+i/1000
result=[result,n];%将每一次循环得出的数据依次放入data矩阵中,可在工作区查看
end
%% 6.编写程序求1-1/2+1/3-1/4+...+1/n-1-1/n的值
function [y] = cal4(n)
y=0;
for m=1:n
y=y+(-1)^(m+1)*(1/m);
end
end
%% 7.编写程序求两个数的最大公约数和最小公倍数
clc;clear;
function [] = text1(a,b)
%求a,b两个数的最大公约数和最小公倍数
if a>b
tem=b;%把两个数中最小的值赋给tem
else tem=a;
end
for n=tem:-1:1 %进行步长为1的倒叙循环,保证求得的公约数是最大的
c=rem(b,n); %rem 取余函数
d=rem(a,n);
%c和d分别是a、b除以m的余数,c、d同时为零时,m即最大公约数
if c==0&d==0
disp(['最大公约数为:',num2str(n)])
break
end
end
m=a*b/n;% m为最小公倍数;两个数的最大公约数与最小公倍数之间的条件是a*b=m*n
disp(['最小公倍数为:',num2str(m)])
end
%% 8.编写程序求斐波那契数列的前n项
function [] = text1(n)
%斐波那契数列,前两项之和等于第三项
%f(n)=f(n-1)+f(n-2)
%第一项和第二项分别都是1
%f(1)=1,f(2)=1
% 程序主题
if n==1
fib=0;
elseif n==2
fib=[0,1];%对数列前两项进行赋值,并放到1行n列矩阵中
else
fib=[0 1 zeros(1,n-2)];
for i=3:n %从第三项开始,满足值等于前两项之和
fib(i)=fib(i-1)+fib(i-2);
end
end
disp(['前',num2str(n),'项斐波那契数列的值为:',num2str(fib)]) %输出结果
end
%% 9.编写程序实现1-n(n>100),同时满足4的倍数和6的倍数的所有数,并列出
function [] = xx(n)
%
if n<=100
disp(['n不满足要求'])
else
data=[];%建立一个矩阵,方便之后将满足条件的值放进去
for i=1:n;
if (rem(i,4)==0&&rem(i,6)==0)%既是4的倍数,又是6的倍数
data=[data,i];
end
end
disp(['满足条件的数为:',num2str(data)])
%最后结果存放在工作区ans内,如果function里面有data
end
%% 10.编写程序将一个正整数n分解质因数,如40=2*2*2*5.
%% 思路
% 先找到一个最小的质数2
%如果这个质数恰好等于n,分解质因数的过程已经结束,输出结果
%如果n不等于k,则输出k的值,用n除以k的上,作为新的正整数n,重复执行上一行过程
n=input('请输入一个数:');
m=2;
disp([num2str(n),'='])
while(1)
% while(1)其中1代表一个常量表达式,永远不等于0,除非设置break等跳出循环语句,循环才会停止
if(~mod(n,m)) % 找到可以整除的数
k=m;
if (n==k) %找到最后一个质数
disp([num2str(n)])
break %跳出循环
else
n=n/k; % 将n除以质数的值继续循环
m=1; %保证循环的质数还是从2开始
disp([num2str(k),'*']) % 将分解的质数显示出来
fprintf('%c%c','*', 8, 8);%删掉两个换行符,使disp输出的结果在同一行
% fprintf('end\n');
end
end
m=m+1;
end
%% 数据处理题
%要求:1.可以修改两个Excel的文件格式,但不能修改文件里面的内容
%尤其是不能把文件中的某些内容改成数字0和1等
%2.必须以脚本文件的格式存储输入命令,直接在命令窗口显示无效。
%% 1.导入Prize1.xlsx数据,并统计各专业人数。
clc;clear;
[num1,txt1]=xlsread('Prize1.xlsx','Sheet1');%导入Prize中第一个工作薄
tabulate(txt1(2:14,5)) %分类统计
%% 2.导入Prize1.xlsx数据,并统计2016级申请奖学金人数
clc;clear;
[num1]=xlsread('Prize1.xlsx','Sheet1');
A=size(num1(:,1),1); %统计行的个数
disp(['2016级申请奖学金的人数为:',num2str(A),'人'])
%% 3.导入Prize1.xlsx和Prize2.xlsx数据,统计申请两个奖学金的总人数
clc;clear;
%导入数据
[num1]=xlsread('Prize1.xlsx','Sheet1');
[num2]=xlsread('Prize2.xlsx','Sheet1');
n=size(union(num1(:,1),num2(:,1)),1);
%分别拿出序号数据并合并(因为有重合人数所以求并集)
disp(['申请两个奖学金的总人数为:',num2str(n),'人'])
%% 4.导入Prize1.xlsx和Prize2.xlsx数据,给出只申请第二个奖学金的名单
clc;clear;
[num1,txt1]=xlsread('Prize1.xlsx','Sheet1');
[num2,txt2]=xlsread('Prize2.xlsx','Sheet1');
A1=num1(:,6);%提出第六列数据
A2=num2(:,6);
B=intersect(A1,A2);%取交集
C=setdiff(A2,B);%去除申请1奖学金的人
disp(['只申请第二个奖学金的名单为:'])
disp([num2str(C)])
%% 5.导入Prize1.xlsx和Prize2.xlsx数据,分别给出申请该两种奖学金女同学和少数名族所占比例
clc;clear;
[num1,txt1]=xlsread('Prize1.xlsx','Sheet1');
[num2,txt2]=xlsread('Prize2.xlsx','Sheet1');% 导入数据
A1=txt1(2:14,3);% prize1的性别数据
B1=txt2(2:27,3);% prize2的性别数据
a1=tabulate(A1);
b1=tabulate(B1);%分别算男女比例
A2=txt1(2:14,4);% prize1的民族数据
B2=txt2(2:27,4);% prize2的民族数据
a2=cell2mat(strfind(A2,'蒙'));
b2=cell2mat(strfind(B2,'蒙'));% 提取蒙族
C2=(size(a2,1)/size(A2,1))*100;
D2=(size(b2,1)/size(B2,1))*100;% 蒙族占比
E=[a1(1,3);b1(1,3);C2;D2];
disp(["两种奖学金各自的女同学和少数民族所占比例为(%):"])
disp(vpa(cell2mat(E),4)) %cell2mat将字符转数字,vpa保留小数点后两位
%% 6.导入Prize1.xlsx和Prize2.xlsx数据,分别给出申请该两种奖学金少数名族女同学名单
clear; clc
T1 = readtable('Prize1.xlsx', 'ReadVariableNames',false);% 导入数据
T1 = T1(2:end, :);% 删去首行
A1=T1(strcmp(T1.Var3, '女') & ~ contains(T1.Var4, '汉') , :)
% A1是申请第一种奖学金少数民族女同学的名单
T2 = readtable('Prize2.xlsx', 'ReadVariableNames',false);
% ReadVariableNames 读取第一行为变量名称
% false 当要读取的区域的第一行包含表格中的数据时使用。readtable 将创建 ‘Var1’,…,‘VarN’ 形式的默认变量名称,其中 N 是变量的数量。
T2 = T2(2:end, :);
A2=T2(strcmp(T2.Var3, '女') & ~ contains(T2.Var4, '汉') , :)
% A2是申请第二种奖学金少数民族女同学的名单
%2015版本用strcmp代替contains比较“汉族”、“汉”,程序如下
clear; clc
T1 = readtable('Prize1.xlsx', 'ReadVariableNames',false);
T1 = T1(2:end, :);
T1(strcmp(T1.Var3, '女') & ~ (strcmp(T1.Var4, '汉族') | strcmp(T1.Var4,'汉')),:)
T2 = readtable('Prize2.xlsx', 'ReadVariableNames',false);
T2 = T2(2:end, :);
T2(strcmp(T2.Var3, '女') & ~ (strcmp(T2.Var4, '汉族') | strcmp(T2.Var4,'汉')),:)
%% 7.导入Prize1.xlsx,列出平均成绩在80-90分同学的名单
clc;clear;
[num1]=xlsread('Prize1.xlsx','Sheet1');
u=num1(:,7);
ind=find(u>80&u<90);
r=num1(ind,6);
disp(['平均成绩在80-90分同学的名单为:'])
disp([num2str(r)])
%% 8.导入Prize2.xlsx,统计发表论文同学的人数
clc;clear;
[num2,txt2]=xlsread('Prize2.xlsx','Sheet1');
f=txt2(2:end,8);
A=sum([f~="无"&f~=""]); % ~=表示不等于,除去表格中“无”和空白格
disp(['发表论文的人数:',num2str(A)])
%% 9.导入Prize1.xlsx,统计论文发表在2018年度的人数
clc;clear;
[num1,txt1]=xlsread('Prize1.xlsx','Sheet1');
f=txt1(2:end,10);
A=sum([f=="2018年"]); % ~=表示不等于
disp(['论文发表在2018年的人数:',num2str(A)])
%% 10.导入Prize2.xlsx,统计有多少同学缺少奖学金和论文发表复印件
clc;clear;
[num2,txt2]=xlsread('Prize2.xlsx','Sheet1');
f=txt2(2:end,14);
n=sum(f~="");
disp(['缺少奖学金和论文发表复印件的人数:',num2str(n)])
%%
clc;clear;
[num2,txt2]=xlsread('Prize2.xlsx','Sheet1');
A=txt2(2:27,14);
B=tabulate(A);
C=B(1,1:2);
D=cell2mat(C(1,2)); % 将元胞数组转化成普通数组
disp(['缺少奖学金和论文发表复印件的人数:',num2str(D)])
%% 金融试验题
%计算
function [d] = rate(a)
Rate=0.042;
NumPeriods1=10;
Payment1=a;
FV1=Payment1*(((1+Rate)^NumPeriods1-1)/Rate)*(1+Rate);
NumPeriods2=10;
Payment2=FV1;
FV2=Payment2*((1+Rate)^NumPeriods2);
NumPeriods3=4;
Payment3=5;
FV3=Payment3*(((1+Rate)^NumPeriods3-1)/Rate)*(1+Rate);
FV4=FV2-FV3;
NumPeriods5=13;
Payment5=FV4;
FV5=Payment5*((1+Rate)^NumPeriods5);
d=FV5
end
% 画图 设
a_all = 0:5:1000;
d_all = [];
for a = a_all
d_all(end+1) = rate2(a);
end
figure(2)
plot(a_all, d_all)
hold on
title('每年存入现金流a与一次性取出现金d的关系示意图')
legend('relation' )
xlabel('a')
ylabel('d')
%%
data=[];
for a=0:5:1000
data=[data,rate2(a)];
end
a=0:5:1000;
plot(a,data)
%% 二叉树
%% 欧式看涨期权
function [price]=Ecall(s0,k,r,T,sigma,N)
% bookput(133.1,133,0.010851,1/12,0.2123,500,0.0206)
% treework(133.1,133,0.010851,1/12,0.2123,500)
dt=T/N;
u=exp(sigma*sqrt(dt));
d=1/u;
p=(exp(r*dt)-d)/(u-d);
tree=zeros(N+1,N+1);
j=0:N;
% 二叉树到期日的现金流
tree(:,N+1)=max(0,s0*u.^(N-j).*d.^j-k);
for j=N-1:-1:0
for i=0:j
tree(i+1,j+1)=exp(-r*dt)*(p*tree(i+1,j+2)+(1-p)*tree(i+2,j+2));
end
end
tree
price=tree(1,1)
end
%% 欧式看跌
function [price]=Eput(s0,k,r,T,sigma,N)
dt=T/N;
u=exp(sigma*sqrt(dt));
d=1/u;
p=(exp(r*dt)-d)/(u-d);
tree=zeros(N+1,N+1);
j=0:N;
% 二叉树到期日的现金流
tree(:,N+1)=max(0,k-s0*u.^(N-j).*d.^j);
for j=N-1:-1:0
for i=0:j
tree(i+1,j+1)=exp(-r*dt)*(p*tree(i+1,j+2)+(1-p)*tree(i+2,j+2));
end
end
%tree
price=tree(1,1);
end
%% 画图
clear; clc; close all %关闭所有的Figure窗口
s0_all = 130:0.1:160;
price11_all = [];
price21_all = [];
for s0 = s0_all
price11_all(end+1) = Ecall(s0,133,0.010851,1/12,0.2123,500);
price21_all(end+1) = Eput( s0,133,0.010851,1/12,0.2123,500);
end
figure(1)
plot(s0_all, price11_all)
hold on
plot(s0_all, price21_all)
title('欧式看涨、欧式看跌的金融资产价格与期权价格关系图')
legend('Ecall' , 'Eput')
xlabel('金融资产价格')
ylabel('期权价格')
sigma_all = 0:0.1:1;
price12_all = [];
price22_all = [];
for sigma = sigma_all
price12_all(end+1) = Ecall(133.1,133,0.010851,1/12,sigma,500);
price22_all(end+1) = Eput( 133.1,133,0.010851,1/12,sigma,500);
end
figure(2)
plot(sigma_all, price12_all)
hold on
plot(sigma_all, price22_all)
title('欧式看涨、欧式看跌的波动率与期权价格关系图')
legend('Ecall' , 'Eput')
xlabel('波动率')
ylabel('期权价格')

Cite As

xiao li (2023). fianlexam (https://www.mathworks.com/matlabcentral/fileexchange/95138-fianlexam), MATLAB Central File Exchange. Retrieved .

MATLAB Release Compatibility
Created with R2021a
Compatible with any release
Platform Compatibility
Windows macOS Linux
Tags Add Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
Version Published Release Notes
1.0.0