数学建模实验-MATLAB编程基础

注:本实验基于MATLAB2018b完成,部分代码可能会由于软件版本原因而报错,此问题只需要查阅自己版本的参考文档即可解决。

一、绘图:

1.在同一图形窗口画出下列两条曲线图像并标注:y1=2x+5;y2=x^2-3x+1。

源代码:

x=-10:0.01:10;
y1=2*x+5;
y2=x.^2-3*x+1;
plot(x,y1,'r',x,y2,'b');%绘制曲线
%添加标注
xlabel('x')
ylabel('y1&y2')
legend('y1=2x+5','y2=x^2-3x+1')
grid on %添加网格线

实验结果:

分析:plot函数可以一次绘制多条曲线,legend用于添加图例。

2.画出下列函数的曲面及等高线。

源代码:

[x,y]=meshgrid(-10:0.1:10);%赋值
z=x.^2+y.^2+sin(x*y);
subplot(2,1,1)%绘制子图
mesh(x,y,z);%绘制三维曲面
subplot(2,1,2);
colormap([0.6 0.5 1]);%调色,可以自己设定参数
contour(x,y,z,20);%绘制等高线

实验结果:

分析:contour用于绘制等值线。

 

二、程序设计:

   3.编写程序计算(x在[-3,3],间隔0.01)

源代码:

x=input('Enter value of x:');%输入x
if x>=-3&&x<=3
    if x>=-3&&x<-1
        y=(-x^2-4*x-3)/2;
    end
    if x<1&&x>=-1
        y=-x^2+1;
     end
     if x>=1&&x<=3
        y=(-x^2+4*x-3)/2;
     end
     fprintf('\ty=%f\n',y)
end
if x<-3||x>3
    fprintf('Please enter the nuber is between -3 and 3.\n')
end

实验结果:

分析:input为输入一个常量函数,fprintf用于输出,disp也用于输出。

 

   4.有一列分数序列:求前15项的和。

源代码:

%n=15;
n=input('\nPlease enter the number of items to besummed(>=0):');
x=zeros(1,n+1);
y=zeros(1,n);
for i=1:n+1
    if i<=2
        x(i)=i;
    end
    if i>2
        x(i)=x(i-1)+x(i-2);
    end
end
for i=1:n
    y(i)=x(i+1)/x(i);
end
fprintf('The sum of the first %d terms is:%f\n', n,sum(y))

实验结果:

分析:zeros(m,n)用于创建一个m*n的零矩阵,ones(m,n)同。

 

   5.是否任意3的倍数m可以写成三个素数p1、p2、p3的和(试着写出所有的m=p1+p2+p3的可能形式)?

源代码:

m=input('请输入任意一个数(3的倍数):');
if mod(m,3)
   error('应输入一个3的倍数')
elseif m<6%m最小为6,满足m=p1+p2+p3形式
   error('输入的数应该>=6')
else
    forp1=1:m %1-m之间查找p1
        for p2=p1:m %p1-m之间查找p2
           for p3=p2:m %p2-m之间查找p3
                if(isprime(p1))&&(isprime(p2))&&(isprime(p3))&&(m==p1+p2+p3)%isprime函数用于对数字是否是素数判断
                   disp([num2str(m),'=',num2str(p1),'+',num2str(p2),'+',num2str(p3)]);
                   break;
                end
           end
       end
    end
end

实验结果:

分析:error可以用于提示错误信息。

三、数据处理与拟合初步:

   6.通过测量得到一组数据:

t

1

2

3

4

5

6

7

8

9

10

y

4.842

4.362

3.754

3.368

3.169

3.038

3.034

3.016

3.012

3.005

分别采用y=c1+c2e^(-t)和y=d1+d2te^(-t)进行拟合,并画出拟合曲线进行对比。

源代码:

t=1:10;
y=[4.842 4.362 3.754 3.3683.169 3.038 3.034 3.016 3.012 3.005];
p1=polyfit(exp(-t),y,1);
xt1=1:0.5:10;
yt1=polyval(p1,exp(-xt1));
subplot(2,1,1)
plot(t,y,'ro',xt1,yt1,'b')
legend('数据点','exp(-t)拟合')
 
p2=polyfit(t.*exp(-t),y,1);
xt2=1:0.5:10;
yt2=polyval(p2,xt2.*exp(-xt2));
subplot(2,1,2)
plot(t,y,'ro',xt2,yt2,'b')
legend('数据点','t*exp(-t)拟合')

实验结果:

分析:polyfit用于多项式数据拟合。

 

7.计算下列定积分

源代码:

syms tx
int(exp(-2*t),0,2)
int(exp(2*t),0,2)
int((x^2-3*x+0.5),-1,1)

实验结果:

分析:syms用于申明变量,int()用于求解积分,参数分别是被积函数、积分下限和积分上限。

 

   8.微分方程组

当t=0时,x1(0)=1,x2(0)=-0.5,求微分方程t在[0,25]上的解,并画出相空间轨道图像。

源代码:

t=0:0.01:25;
[x1,x2]=dsolve('Dx1=0.5-x1','Dx2=x1-4*x2','x1(0)=1','x2(0)=-0.5','t');
x1=3*exp(-t).*(exp(t)/6 + 1/6);
x2=exp(-t).*(exp(t)/6 + 1/6) -exp(-4*t).*(exp(4*t)/24 + 19/24);
plot(t,x1,t,x2);

实验结果:

分析:dsolve函数用于求解微分方程。

 

   9.设通过测量得到时间t与变量y的数据:

t=[0 0.3 0.8 1.1 1.6 2.3];y=[0.5 0.82 1.14 1.25 1.35 1.41];

分别采用多项式:y=a0+a1t+a2t^2和指数函数:y=b0+b1e^t+b2te^t进行拟合,并计算均方误差、画出拟合效果图进行比较。

源代码:

t=[0 0.3 0.8 1.1 1.6 2.3];
y=[0.5 0.82 1.14 1.25 1.351.41];
p1=polyfit(t,y,2);
xt1=1:0.01:2.3;
yt1=polyval(p1,xt1);
z1=polyval(p1,t);
wuchal=sqrt(sum(z1-y).^2);
subplot(2,1,1)
plot(t,y,'ro',xt1,yt1,'b')
legend('数据点','y=a0+a1t+a2t^2拟合','location','southeast')
 
p2=polyfit(exp(-t),y,2);
xt2=1:0.01:2.3;
yt2=polyval(p2,exp(-xt2));
z2=polyval(p2,t);
wucha2=sqrt(sum(z2-y).^2);
subplot(2,1,2)
plot(t,y,'ro',xt2,yt2,'b')
legend('数据点','y=b0+b1e^t+b2te^t','location','southeast')

实验结果:

分析:polyval用于评估多项式。

 

   10.观察函数:y=e^x-1.5cos(2*pi*x)在区间[-1,1]上的函数图像,完成下列两题:

(1)  用函数fzero求解上述函数在[-1,1]的所有根,验证你的结果;

源代码:

x=-1:0.1:1;
y=exp(x)-1.5*cos(2*pi*x);
y0=0;
plot(x,y,'b',x,y0,'r*');
fun=@(x)exp(x)-1.5*cos(2*pi*x);
x1= fzero(fun,-0.8)
x2= fzero(fun,0)
x3= fzero(fun,0.8)
xlabel('X');
ylabel('Y');

实验结果:

(2)用函数fminbnd求解上述函数在[-1,1]上的极小、极大、最小和最大值,在函数图像上标出你求得的最小值点作出验证。

注:可以用help fzero命令查看fzero的调用格式,fminbnd典型的调用方法是:fminbnd(@myfun,x1,x2)  %返回函数myfun在区间[x1,x2]上的。

源代码:

disp('函数在区间[-1,1]:');
%求极小值
fun1=@(x)exp(x)-1.5*cos(2*pi*x);
[xmin1,ymin1]=fminbnd(fun1,-0.2,0.2);
disp(['极小值坐标为:(' num2str(xmin1),',',num2str(ymin1),')']);
%求极大值
fun2=@(x)(-(exp(x)-1.5*cos(2*pi*x)));
[xmax1,ymax1]=fminbnd(fun2,-1,-0.2);
[xmax2,ymax2]=fminbnd(fun2,0.2,1);
disp(['极大值坐标为:(' num2str(xmax1),',',num2str(-ymax1),')和(',num2str(xmax2),',',num2str(-ymax2),')']);
% 求最小值
ymin = fun1(1);
if ymin>fun1(-1)
    ymin = fun1(-1);
end
if ymin>ymin1
    ymin=ymin1;
end
disp(['最小值为:',num2str(ymin)])
% 求最大值
ymax = fun1(1);
if ymax<fun1(-1)
    ymax = fun1(-1);
end
ymax3=-ymax2;
if (-ymax1)>(-ymax2)
    ymax3=-ymax1;
end
if ymax<ymax3
    ymax=ymax3;
end
disp(['最大值为:',num2str(ymax)])

实验结果:

谢谢您的观看,查看更多内容请关注微信公众号“理工科日记”。

发布了5 篇原创文章 · 获赞 37 · 访问量 3077

猜你喜欢

转载自blog.csdn.net/weixin_44780332/article/details/105279468
今日推荐