matlab上课的作业:总共14道题,涵盖了matlab的各种基本的用法
本文约6000字,预计阅读20分钟
第一题:
第一题很简单,就是调用randn函数
clc;
clear;
y=1+2*randn(5);
p=find(y>0.4&y<0.6);
data=y(p)
第二题:
这道题就是判断数位交换以后的数还是不是素数
clc
clear
res=[];
for j=11:99
if(isprime(j))
temp1=j;
temp2=0;
while temp1
temp2=temp2*10+mod(temp1,10);
temp1=fix(temp1/10);
end
if(isprime(temp2))
res=[res,j];
end
end
end
function [judge] = isprime(n)
%UNTITLED4 此处显示有关此函数的摘要
% 此处显示详细说明
flag=1;
for j=2:sqrt(n)
if mod(n,j)==0
flag=0;
break
end
end
if flag
judge=1;
else
judge=0;
end
end
第三题
不断的取余数,然后&1就行
clc;
clear;
m=input("请输入一个整数: ");
res=0;
while m
n=mod(m,10);
if(mod(n,2)==1)
res=res+1;
end
m=fix(m/10);
end
res
第四题:
这道题是一个约瑟夫环的问题。我们已经非常熟悉了,用模拟的方式去做。
但其实可以用递推的方式。
我们假设f(n)表示的是当总人数为n的时候,并且间隔为k时最终剩下的那个人的编号,那么因为每一次删掉的人数是固定的,那么如果我们找到f(n-1)和f(n)的关系,那么就可以从1递推到n。
我们假设编号是从0开始,显然f(1)= 0,也就是说当删掉一个人的时候,我们这个问题就已经转化成了还有n-1个人的时候最终留下来的那个人你的下标是多少,很明显,当我们需要重新编号的时候:
我们假设n=10,k=3,第一次删掉的这个人的下标应该是2,删完以后下一个人序号就需要更新,重新数到3。我们发现,每一次删掉一个人下标跟之前的下标差k,这就是两个状态之间的关系,为了防止数组的越界,我们需要mod(n)。
//约瑟夫问题
clc;
clear;
n=10;
m=7;
f(1)=1;
for i=2:n
f(i)=mod((f(i-1)+m-1),i+1);
end
f
g(1)=0;
for i=2:n
g(i)=mod((g(i-1)+m),i);
end
g+1
第五题:
clc
clear
a=1;
b=1;
% c=sqrt(a^2+b^2);
y=linspace(-5,5,50);
x=(y.^2+1).^0.5;
plot(x,y,'k');
hold on
grid on
% plot(x,-y,'k');
% plot(-x,y,'k');
% plot(-x,-y,'k');
axis([-5 5 -5 5]);
第六题:
画图,调用的函数mesh,meshgrid,contour
xx=-5:0.1:5;
yy=xx;
[x,y]=meshgrid(xx,yy);
z=x.^2+y.^2.*sin(x.*y);
subplot(1,2,1)
mesh(x,y,z)
subplot(1,2,2)
contour(x,y,z)
colorbar
figure(1)
% axis equal
第七题:
subs()函数表示将符号表达式中的某些符号变量替换为指定的新的变量
clc
clear
syms x y
y=(sin(x))^2+(cos(2*x))^2;
Y=diff(y,2);
res=subs(Y,x,2)
第八题:
这是一道三次样条插值的问题当然我们也可以直接去算。
clc
clear
x=1:10;
y=x.^(1/3);
res=interp1(x,y,25,'spline');
第九题:
这是一道曲线拟合的问题
clc
clear
x=[1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6]';
y=[2.9462 3.4094 3.8090 4.1643 4.4794 4.7654 5.0254 5.2668];
y=y';
syms t
f=fittype('a+b*log(x)/log(5)','independent','x','coefficients',{'a','b'});
cfun=fit(x,y,f); %显示拟合函数,数据必须为列向量形式
xi=1:0.1:2.8;
yi=cfun(xi);
figure
plot(x,y,'r*',xi,yi,'b-');
title('拟合函数图形');
得到的结果是这样的:
第十题:
两种方法计算定积分:
%% 积分的数值求解
x=1/exp(1):0.001:1;
y=-log(x);
z1=trapz(x,y);
x=1:0.001:exp(1);
y=exp(x);
z2=trapz(x,y);
g=@(x)(-log(x));
f1=quad(g,1/exp(1),1);
h=@(x)(log(x));
f2=quad(h,1,exp(1));
%% 定积分的符号解法
syms x
fun=(-log(x));
I1=vpa(int(fun,x,1/exp(1),1))
fun=(log(x));
I2=vpa(int(fun,x,1,exp(1)))
以下是结果
第十一题:
这里我们使用dsolve函数去求解微分方程的数值解
clc
clear
syms y(x)
Dy=diff(y);
y=dsolve(diff(y,2) == x+y ,y(1) == 2,Dy(1) == 3);
yy=subs(y(1),x,1.4);
yy=double(yy)
fplot(y(1),[0,1.4])
第十二题:
求最大值可以直接max一发完事儿
ff=sin(x)+(cos(x))^2;
fplot(x,ff)
max(subs(ff,x,(0:0.01:2*pi)));
第十三题:
这是一道简单的线性规划的问题,不过我自己不喜欢用linggo去求解(主要是懒),还是matlab一发入魂好。
%% x1,x2,x3 代表的是每种食物的含量
clc;clear;
c=[0.2 0.7 0.4]';
a=[-3 -2 -1;-1 -0.8 -0.2;-0.5 -1 -0.2;0.5 0.1 0.3];
b=[-700 -30 -100 200]';
[x,y]=linprog(c,a,b,[],[],zeros(3,1));
% y=-y;
x
第十四题:
终于到最后一题啦!!!
简单的额背包问题,不过我们先把重量*100变成整数就好计算了
clc;
clear;
w=[0.78 0.56 0.90 0.59 0.23 0.86 0.83 0.94 0.28 0.65];
w=[w,0.42 0.63 0.93 0.78 0.44 0.17 0.58 0.94 0.61 0.11];
w=fix(w*100);
v=[0.33 0.73 0.96 0.22 0.33 0.33 0.32 0.41 0.33 0.53];
v=[v,0.85 0.59 0.36 0.78 0.61 0.15 0.80 0.22 0.52 0.40];
dp=zeros(21,600);
for i=1:20
for j=1:600
if j<=w(i)
dp(i+1,j) = dp(i,j);
continue;
end
if dp(i,j)<(dp(i,j-w(i))+v(i))
dp(i+1,j)=dp(i,j-w(i))+v(i);
else
dp(i+1,j)=dp(i,j);
end
end
end
dp(21,600)
距离2021年春节还有96天,加油!!!
近期预告:
线段树、树状数组、状压DP、Trie树、图论
如果大家有什么建议或者要求请后台留言
联系方式:shirandexiaowo@foxmail.com