资源描述
MATLAB习题
1.利用diag函数构建对角矩阵。
diag([1,2,3,5],0)+diag([2,2,2],1)+diag([3,3],2)+diag(1,3)
2.求解非线性方程组。
s=solve('x^3+y=31','x+y=7','x','y')
3.求解线性方程组。
a=[1,1,1;2,1,0;0,1,1];
b=[4;4;3];
linsolve(a,b)
corr2cov函数把相关系数矩阵转换为协方差矩阵
a=corr2cov(b,c) a协方差矩阵,b标准差向量,c相关系数矩阵
4.计算1+2+3+4+5。
t=1;
sum=0;
while t<=5
sum=sum+t;
t=t+1;
end
sum
5.已知资产组合中有3个品种,各资产预期回报、标准差及相关系数如表,计算资产协方差阵。
项目
资产A
资产B
资产C
预期回报
0.1
0.15
0.12
标准差
0.2
0.25
0.16
相关矩阵系数
资产A
1
0.8
0.4
资产B
0.8
1
0.3
资产C
0.4
0.3
1
Returns=[0.1,0.15,0.12];
STDs=[0.2,0.25,0.16];
Correlations=[1,0.8,0.4;0.8,1,0.3;0.4,0.3,1];
Covariance=corr2cov(STDs,Correlations)
6.某资产组合中有3种资产,各资产收益率分别为0.2,0.1,0.15。要求资产1与资产3的权重之和小于资产2权重,且没有卖空。求解使得上述收益率最大的投资组合。(0.4,0.5,0.1?)
f=[-0.2,-0.1,-0.15];
a=[1,-1,1];
b=0;
aeq=[1,1,1];
beq=1;
lb=[0,0,0.1];
ub=[1,1,1];
x=linprog(f,a,b,aeq,beq,lb,ub)
7.已知,约束条件,初始值,求。
fun='-x(1)*x(2)*x(3)';
a=[-1,-2,-2;1,2,2];
b=[0;72];
x0=[10,10,10];
[x,fval]=fmincon(fun,x0,a,b)
8.资产组合中有3种资产,各资产收益率和协方差矩阵如下表所示投资者的目标函数是,其中H是协方差阵,q是超额收益向量,x是各资产权重。要求利用fmincon极小化该目标函数,且每个资产权重大于等于0,不允许卖空,且资产组合的夏普比率大于1,资产组合的收益率为0.145。
项目
资产1
资产2
资产3
协方差
资产1
0.02
0.05
0.01
资产2
0.05
0.03
0.015
资产3
0.01
0.015
0.01
预期超额收益
0.15
0.15
0.14
function [ g,ceq ] = nonlcon( x )
r=0.15*x(1)+0.15*x(2)+0.14*x(3);
v=0.02*x(1)^2+0.03*x(2)^2+0.01*x(3)^2+2*0.05*x(1)*x(2)+2*0.01*x(1)*x(3)+2*0.015*x(2)*x(3);
g=1-r/sqrt(v);
ceq=[];
end
clear;
fun='0.5*(0.02*x(1)^2+0.03*x(2)^2+0.01*x(3)^2+2*0.05*x(1)*x(2)+2*0.01*x(1)*x(3)+2*0.015*x(2)*x(3))-0.15*x(1)-0.15*x(2)-0.14*x(3)';
x0=[0,0,0];
Aeq=[0.15,0.15,0.14;1,1,1];
beq=[0.145,1];
lb=[0,0,0];
ub=[1,1,1];
[x,fval]=fmincon(fun,x0,[],[],Aeq,beq,lb,ub,@nonlcon)
9.X,Y服从二元正态分布,条件如下,结果.
mu=[1,-1];
sigma=[0.9,0.4;0.4,0.3];
x=[2,1];
f=mvncdf(x,mu,sigma)
10.矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。
a=[1,2,3;4,5,6];
b=[7,8,9;10,11,12];
try
c=a*b;
catch
c=a.*b;
end
c
lasterr %显示出错原因
11.一个三位整数各数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
for m=100:999
m1=fix(m/100);
m2=rem(fix(m/10),10);
m3=rem(m,10);
if m==m1^3+m2^3+m3^3
disp(m);
end
end
12.从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
sum=0;
cnt=0;
val=input('enter a number(end in 0):');
while(val~=0)
sum=sum+val;
cnt=cnt+1;
val=input('enter a number(end in 0):');
end
if(cnt>0)
sum
mean=sum/cnt
end
13.求[100,200]间第一个能被21整除的整数。
for n=100:200
if rem(n,21)~=0
continue
end
break
end
n
14.猜数游戏。首先由计算机产生[1,100]之间的随机整数,然后由用户猜测所产生的随机数,根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则产生“Low”,等于则显示“You won”,同时退出游戏。用户最多可以猜7次。
a=round(unifrnd(1,100));
i=0;
test=1;
for i=1:7
b=input('your number:');
if b<a
disp('low');
elseif b>a
disp('high');
else
disp('you won');
test=0;
break;
end
end
if test==1
disp('you lost');
end
5.素数是大于1,且除了1和它本身以外,不能被其他任何整数所整除的整数。用筛选法求素数的基本思想是:要找出2—m中划去2的倍数(不包括2),然后划去3的倍数(不包括3)……直到再划去不超过的数的倍数,剩下的数都是素数。求0~100的素数,及其和.
clear;
sum=5;
ss=0;
prime=[2,3];
for i=4:100
for j=2:fix(sqrt(i))
if rem(i,j)==0
ss=0;
break;
else
ss=1;
end
end
if ss==1
prime=[prime,i];
sum=sum+i;
end
end
prime
sum
16. 编写程序模拟掷骰子游戏。已知掷骰子游戏的游戏规则为:每个骰子有6面,这些面包含1、2、3、4、5、6个点,投两枚骰子之后,计算点数之和。如果第一次投的点数和为7或11,则游戏者获胜;如果第一次投的点数和为2、3或12,则游戏者输;如果第一次投的点数和为4、5、6、8、9或10,则将这个和作为游戏者获胜需要掷出的点数,继续投骰子,直到赚到该点数时算是游戏者获胜。如果投掷7次仍未赚到该点数,则游戏者输。
disp(['开始请输入yes,不开始请输入NO']);
kaishi=input('开始吗?','s');
if kaishi=='yes'
a1=1+(6-1)*round(rand(1));
a2=1+(6-1)*round(rand(1));
a3=a1+a2;
if a3==3||a3==11
disp(['打赌者赢了']);
disp(['因为第一个骰子值=',num2str(a1),';第二个的=',num2str(a2),';两个之和=',num2str(a3)]);
elseif a3==2||a3==7||a3==12
disp(['打赌者输了']);
disp(['因为第一个骰子值=',num2str(a1),';第二个的=',num2str(a2),';两个之和=',num2str(a3)]);
elseif a3==4||a3==5||a3==6||a3==8||a3==9||a3==10
k=a3;
k1=1;
while k>0
k1=k1+1;
disp(['第',num2str(k1-1),'次丢的结果:','第一个骰子值=',num2str(a1),';第二个的=',num2str(a2),';两个之和=',num2str(a3)]);
disp(['未分出输赢,继续丢,【已丢了',num2str(k1-1),'次】']);
a1=1+(6-1)*round(rand(1));
a2=1+(6-1)*round(rand(1));
a3=a1+a2;
if a3==k
disp(['哈哈,打赌者赢了']);
disp(['因为第',num2str(k1),'次丢的结果是:','第一个骰子值=',num2str(a1),';第二个的=',num2str(a2),';两个之和=',num2str(a3)]);
break;
elseif a3==7
disp(['唉,打赌者输了']);
disp(['因为第',num2str(k1),'次丢的结果是:','第一个骰子值=',num2str(a1),';第二个的=',num2str(a2),';两个之和=',num2str(a3)]);
break;
end
end
end
end
展开阅读全文