%pi是系统常量(3.14159...)
%一般变量名不要起成ans,因为ans是Matlab的一个预定义变量
%Matlab对字母大小写是敏感的
%指数函数是:exp(x)
%clc清除窗口显示内容的命令
%clear清除Matlab工作空间中保存的变量
%↑键调回已输入过命令
%matlab定义一个变量,默认为双精度数组
%数组行列标识均从1开始
%创建一维数组变量
a=[1 3 pi 3+5*1i]; %or a=[1, 3, pi, 3+5*i]
b=1:10 % b=1 2 3 4 5 6 7 8 9 10
c=1:2:10 % c=1 3 5 7 9
%由5个元素组成的行向量
%x = 1.0000 1.2500 1.5000 1.7500 2.0000
x= linspace(1,2,5);
%列向量的创建
x= [1; 2; 3]%等价于行向量的转置: x= (1:3)'
%创建二维数组变量
a2=[1 2 3;4 5 6;7 8 9];
a=[1 2 3]; b=[2 3 4];
c=[a;b] ;%二维
c1=[a b];%一维
%函数ones(生成全1矩阵)、zeros (生成全0矩阵) reshape
%创建全1的3x3数组
ones(3)
%创建全1的3x4数组。
ones(3,4)
%reshape:从上到下按列排列,先排第一列,然后第二列,…要求数组的元素总数不变
%从上到下按列排列,先排第一列,然后第二列,…
a=[-4 -3 -2 -1 0 1 2 3 4];
b=reshape(a, 3, 3);
%单下标的使用,注意数组的排列顺序
a=zeros(2, 5);
a(:)=-4:5;
%一维数组元素与子数组的寻访与赋值
a=linspace(1,10,5)
a(3) %寻访a的第3个元素
a([1 2 5]) %寻访a的第1、2、5个元素组成的子数组
a(3:-1:1) %由前3个元素倒序构成的子数组
%函数end作为参数使用,返回最后一个元素的下标
a(3:end) %第3个及其后所有元素构成的子数组
a(1:3) %寻访前3个元素组成的子数组
a(3:end-1)%从第3个到倒数第二个元素构成的子数组
a([1 2 3 5 5 3 2 1])%数组元素可以被任意重复访问,构成长度大于原数组的新数组
a(3)=0 %修改数组a的第3元素值为0
a([2 5])=[1 1]%一次可以修改多个数组元素的值
%二维数组元素与子数组的寻访与赋值
a_2=zeros(2, 4) %创建2x4的全0数组
a_2(:)=1:8%填充,注意元素的排列顺序
a_2([2 5 8]) %单下标方式寻访多个元素
a_2([2 5 8]) =[10 20 30]%修改
a_2(:,[2 3])=ones(2) %双下标方式寻访并修改
a_2(:,end)%最后一列
a_2(:,end-1)%倒数第二列
a_2(:, end:-1:3)%第三列到最后一列,倒序
a_2(end,:)%最后一行的所有列
a_2(end,[2:4])%最后一行的2->4列
a_2 ([4 6])=6:7%修改值
a_2(end,[2:end-1])%最后一行的2->倒数第二列
%双下标到单下标的转换
A = [17 24 1 8; 2 22 7 14; 4 6 13 20]
A(:,:,2) = A - 10%第二维的所有数字-10
A(2,1,2)%访问第二维的元素
sub2ind(size(A),2,1,2)%查找第二行第一列第二页所对应元素的单下标
A(14)%用单下标访问值
%单下标到双下标的转换
b = zeros(3);%全为0的3x3的方阵
b(:) = 1:9%填充
IND = [3 4 5 6]
%把这些数字的单下标变成双下标
[I,J] = ind2sub(size(b),IND)
%size函数返回变量的大小,即变量数组的行列数
%length函数返回变量数组的最大维数
I=eye(3);%单位矩阵
A=[1:5;6:10;11:15;16:20;21:25]
% B=repmat(A,m,n)
% 把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, size(A,2)*n]
% B=repmat(A,[m n p...])
% B是由 m×n×p×… 个 A 平铺而成的高维数组。
% B的维数是 [size(A,1)*m, size(A,2)*n, size(A,3)*p, ...]
repmat(A, [1 1 5])
ans(:,:,1)%第1层
ans(:,:,2)%第2层
ans(:,:,3)%第3层
ans(:,:,4)%第4层
ans(:,:,5)%第5层
whos A
建立5行8列的随机矩阵。统计该矩阵的最大值、最小值、中值、平均值、和所有元素的和
x=randn(5,8)%建立5行8列的随机矩阵
max(max(x))%该矩阵的最大值
min(min(x))%该矩阵的最小值
b=median(x(:))%该矩阵的中值
d=mean(x(:))%该矩阵的平均值
s=sum(x(:))%该矩阵所有元素的和
建立一个矩阵A ,用空矩阵的方法删除A的第二列和第四列元素
A=[1 2 3 4 5 6;7 8 9 10 11 12;13 14 15 16 17 18]
A(:,2)=[]%删除A的第2列元素
A(:,4)=[]%删除A的第4列元素
建立5×6矩阵,要求输出矩阵的第n行元素。当n值超过矩阵的行数时,自动转为输出矩阵的最后一行元素,并给出出错 信息
function a=csp_happycoding
b=zeros(5,6);
b(:)=1:30;
n= input('请输入要输出的行数:')
if(n>0&&n<6)
%输出矩阵的第n行元素
a=b (n,:);
else
%输出矩阵的第5行元素
a=b(5,:);
disp( 'ERROR!');
end
利用randn函数生成符合正态分布的10×5随机矩阵A,进行如下操作:
a) 求A的最大元素和最小元素;
b) 求A的每行元素的和以及全部元素的和;
c) 分别对A的每列元素按升序、每行元素按降序排列。
A=randn(10,5)
max(max(A))
min(min(A))
%sum(a,2)来求矩阵的各行之和
sum(A,2)
%sum(a)来求矩阵的各列之和
sum(sum(A))
sort(A)%按列升序
%Y=sort(X,DIM,MODE)
%参数DIM表示对哪一个维数进行排序,例如当X是一个二维矩阵,当DIM=1时表示对X的每一列进行排序,当DIM=2时表示对X的每一行进行排序。
%参数MODE表示按哪一种模式进行排序,当MODE=‘ASCEND’的时进行升序排序,当MODE=‘DESCEND’时,进行降序排序。
%Y返回已经排好序的X。
sort(A,2,'descend')
plot函数基本用法:
plot(x1,y1,x2,y2)
plot(x, y, 'o',x1, y1, 'r-')
线方式: - 实线 :点线 -. 虚点线 - - 波折线
点方式: . 圆点 +加号 * 星号 x x形 o 小圆
颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青
画出 y = 1 / ( x + 1 ) y=1/(x+1) y=1/(x+1)的函数曲线, x ∈ [ 0 , 100 ] x∈[0, 100] x∈[0,100]
x=0:100;
y=1./(x+1);%注意点除
plot(x, y);%绘图函数
legend('y=1/(x+1)');
生成一个信号: x = s i n ( 2 π t ) + s i n ( 4 π t ) x=sin(2\pi t)+sin(4\pi t) x=sin(2πt)+sin(4πt)
%计算采样时间点
t = [0:199]./100; %向量要除以一个数,必须点除
%生成信号
x = sin(2*pi*t) + sin(4*pi*t);
plot(t,x);
legend('x = sin(2*pi*t) + sin(4*pi*t)');%生成图例
绘制 y = s i n ( t ) ∗ s i n ( 9 t ) y=sin(t)*sin(9t) y=sin(t)∗sin(9t)包络线
%绘制包络线
t=(0:pi/100:pi)'; %长度为101的时间采样行向量转置为列向量
%包络线上面一条,下面一条,放到2维数组里
y1=sin(t)*[1,-1]; %包络线函数值,101x1乘1x2是(101x2)的矩阵
%因为对应元素相乘,所以用点乘
y2=sin(t).*sin(9*t); %长度为101的调制波列向量(低频信号*高频信号)
t3=pi*(0:9)/9;%步长为9/pi的9个零点横坐标行向量
y3=sin(t3).*sin(9*t3);
%red,blue,蓝色圈
plot(t,y1,'r:',t,y2,'b',t3,y3,'bo')
axis([0,pi,-1,1])%依次控制x,y轴的范围
重绘波形 y = s i n ( t ) ∗ s i n ( 9 t ) y=sin(t)*sin(9t) y=sin(t)∗sin(9t)及其包络线(多次叠绘)
t=(0:pi/100:pi)'; %长度为101的时间采样列向量
y1=sin(t)*[1,-1]; %包络线函数值,是(101x2)的矩阵
y2=sin(t).*sin(9*t); %长度为101的调制波列向量
t3=pi*(0:9)/9;
y3=sin(t3).*sin(9*t3);
plot(t,y1,'r:')%红色包络线
hold on%保持当前坐标轴和图形,并可以接受下一次绘制
plot(t,y2,'b')%画信号波形
plot(t3,y3,'bo')%画点
axis([0,pi,-1,1])%控制显示范围
hold off%取消当前坐标轴和图形保持
利用hold绘制离散信号的波形
t=2*pi*(0:20)/20;
y=cos(t).*exp(-0.4*t);
stem(t,y,'g');%绘制离散序列数据,不会把点连成平滑曲线了,green
hold on;
stairs(t,y,'r');%绘制y中元素的阶梯图,red
hold off
双纵坐标:plotyy指令
%plotyy(x1, y1, x2, y2)
%x1-y1曲线y轴在左,x2-y2曲线y轴在右。
x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
plotyy(x,y1,x,y2);
subplot指令来 分割 图形窗
t=(pi*(0:1000)/1000)';
y1=sin(t); y2=sin(10*t); y12=sin(t).*sin(10*t);
%预留2X2=4个子图
subplot(2,2,1),plot(t,y1);axis([0,pi,-1,1])
subplot(2,2,2),plot(t,y2);axis([0,pi,-1,1])
subplot('position',[0.2,0.05,0.6,0.45])
%蓝色实线画图形,红色虚线画包络线
plot(t,y12,'b-',t,[y1,-y1],'r:')
绘制图形的辅助操作
t=(0:15)*2*pi/15;
y=sin(t);
subplot(3,2,1), plot(t, y); title('Lins style is default')
subplot(3,2,2), plot(t, y, 'o'); title('Lins style is o')
subplot(3,2,3), plot(t, y, 'k:'); title('Lins style is k:')
subplot(3,2,4), plot(t, y, 'k:*'); title('Lins style is k:*')
subplot(3,2,5), plot(t, y, 'm-d'); title('Lins style is m-d')
subplot(3,2,6), plot(t, y, 'r-p'); title('Lins style is r-p')
已知 y 1 = x 2 , y 2 = c o s ( 2 x ) , y 3 = y 1 × y 2 y1=x^2,y2=cos(2x),y3=y1 \times y2 y1=x2,y2=cos(2x),y3=y1×y2,完成下列操作:
(1) 在同一坐标系下用不同的颜色和 线性 绘制三条曲线;
(2) 以子图形式绘制三条曲线;
(3) 分别用条形图、阶梯图、杆图和填充图绘制三条曲线。
x=0:pi/50:2*pi;
y1=x.*x;
y2=cos(2*x);
y3=y1.*y2;
plot(x,y1,'r*-')
hold on
plot(x,y2,'bo--')
hold on
plot(x,y3,'k+:')
x=0:pi/50:2*pi;
y1=x.*x;
y2=cos(2*x);
y3=y1.*y2;
subplot(1,3,1)
plot(x,y1,'r*-')
subplot(1,3,2)
plot(x,y2,'bo--')
subplot(1,3,3)
plot(x,y3,'k+:')
x=0:pi/50:2*pi;
y1=x.*x;
y2=cos(2*x);
y3=y1.*y2;
figure(1)
subplot(2,2,1)
bar(x,y1,'b')
subplot(2,2,2)
stairs(x,y1,'r')
subplot(2,2,3)
stem(x,y1,'k')
subplot(2,2,4)
fill(x,y1,'g')
figure(2)
subplot(2,2,1)
bar(x,y2,'b')
subplot(2,2,2)
stairs(x,y2,'r')
subplot(2,2,3)
stem(x,y2,'k')
subplot(2,2,4)
fill(x,y2,'g')
figure(3)
subplot(2,2,1)
bar(x,y3,'b')
subplot(2,2,2)
stairs(x,y3,'r')
subplot(2,2,3)
stem(x,y3,'k')
subplot(2,2,4)
fill(x,y3,'g')
在同一个坐标轴下绘制下列2条曲线
y = 2 x − 0.5 y=2x-0.5 y=2x−0.5
{ x = sin ( 3 t ) cos t y = sin ( 3 t ) sin t 0 ≤ t ≤ π
{𝑥=sin(3𝑡)cos𝑡𝑦=sin(3𝑡)sin𝑡0≤𝑡≤𝜋 { x = sin ( 3 t ) cos t y = sin ( 3 t ) sin t 0 ≤ t ≤ π {x=sin(3t)costy=sin(3t)sint0≤t≤π
x=-1:0.1:1;
y=2*x-0.5;
plot(x,y,'r*-');
hold on;
t=0:pi/50:pi;
x=sin(3.*t).*cos(t);
y=sin(3.*t).*sin(t);
plot(x, y, 'b+--');
建立5阶方阵A,判断其元素能否被3整除
A = [24, 35, 13, 22, 63; 23, 39, 47, 80, 80;
90, 41, 80, 29, 10; 45, 57, 85, 62, 21; 37, 19, 31, 88, 76]
P = rem(A,3)==0 %被3除,求余
在 [ 0 , 3 π ] [0,3π] [0,3π]区间,求 y = s i n x y=sinx y=sinx的值。要求消去负半波,即 ( π , 2 π ) (π,2π) (π,2π)区间内的函数值置零
x = 0:pi/100:3*pi;
y = sin(x);
y1 = (y>=0).*y; %消去负半波
plot(x, y1);
建立一个字符串向量,然后对该向量做如下处理:
(1)取第1-5个字符组成子字符串;
(2)将字符串倒过来重新排列;
(3)将字符串中的小写字母变成相应的大写字母,其余字符不变;
(4)统计字符串中的小写字母的个数
str ='Learning';
str2=str;
sub=str(1:5)%取第1-5个字符组成子字符串
revstr=str(end:-1:1)%将字符串倒过来重新排列
len=length(str);
num=0
for i=1:len
if (str(i)>='a'&& str(i)<='z')
str(i)=str(i)-32;
num=num+1;%累加字符串中的小写字母的个数
end
end
str
num

x=0:pi/100:5*pi%间隔是pi/100
y=sin(x);
q=(x<=pi|x>=2*pi);%(π,2π)区间内的函数值置0
y1=q.*y;
q1=((x>pi/3 & x<2*pi/3)|(x>7*pi/3 & x<8*pi/3));
q2=~q1;%取补集
y2=q1.*sin(pi/3)+q2.*y1;
subplot(1, 3, 1)%第1份子图
plot(x, y, 'r*-')
subplot(1, 3, 2)%第2份子图
plot(x, y1, 'b+-')
subplot (1, 3, 3)%第3份子图
plot(x, y2,'go-')
求一元二次方程的根
%由于Matlab能进行复数运算,所以不需要判断方程的判别式,
%可直接根据求根公式求根
a = input('a=?');
b = input('b=?');
c = input('c=?');
d = b*b-4*a*c;
x = [(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];%一维数组
%num2str是number to string 的简称
disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);
从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和
sum = 0;
n = 0;
x = input('Enter a number(end in 0):');
while(x~=0)
sum = sum+x;
n = n+1;
x = input('Enter a number(end in 0):');
end
if(n>0)
sum
mean = sum/n
end
求[100,200]之间第一个能被21整除的整数
for n = 100:200
if rem(n,21)~=0;
continue
end
break
end
n
输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出
%x = input(prompt) %输入的东西当成数字或者矩阵
%str = input(prompt,'s') %输入的东西当成字符串存起来
c = input('请输入一个字符:','s');
if c >='A' && c<='Z'
disp(char(abs(c) + (abs('a')-abs('A'))));
elseif c>='a' && c<='z'
disp(char(abs(c)- (abs('a') - abs('A'))));
elseif c>='0' && c<='9'
disp(abs(c)-abs('0'));
else
disp(c);
end
某商场对顾客所购买的商品实行打折销售,标准如下:
price<200 没有折扣
200<=price<500 3%折扣
500<=price<1000 5%折扣
1000<=price<2500 8%折扣
2500<=price<5000 10%折扣
5000<=price 14%折扣
输入所售商品的价格,求其实际销售价格
%switch输入所售商品的价格,求其实际销售价格
%num2cell函数是将数值矩阵转化为单元矩阵
price = input('请输入商品价格');
switch fix(price/100)
case{0,1} %价格小于200
rate = 0;
case{2,3,4}
rate = 3/100; %价格大于等于200但小于500
case num2cell(5:9)
rate = 5/100; %价格大于等于500但小于1000
case num2cell(10:24)
rate = 8/100; %价格大于等于1000但小于2500
case num2cell(25:49)
rate = 10/100; %价格大于等于2500但小于5000
otherwise
rate = 14/100; %价格大于等于5000
end
price = price*(1-rate) %输出商品实际销售价格
矩阵乘法运算要求两矩阵的维数相容,否则会出错,先求两矩阵的乘积,若出错则自动转去求两矩阵的点乘
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 %显示出错原因
利用Matlab的特点,常用向量运算来代替循环操作
y = 0;n = 100;
for i=1:n
y = y+1/i^2;
end
y
%程序可以替换如下:
n = 100;
i = 1:n;
f = 1./i.^2;
y = sum(f)
Matlab的函数操作
function [a,b] = func(a,b)
c = a; a = b; b = c;
x = 1:10;
y = [11,12,13,14;15,16,17,18];
[a,b] = func(x,y)
产生20个两位随机整数,输出其中小于平均数的偶数
function y=csp_happycoding
n=randi([1,100],20,1)
sum1=sum(n(:))
aver=sum1/20
for i=1: 20
if(n(i)<aver&&mod(n(i),2)==0)
y=n(i)
end
end

function f=fu
f(1)=1;
f(2)=0;
f(3)=1;
for i=4:100
f(i)=f(i-1)-2*f(i-2)+f(i-3);
end
maxf=max(f)
minf=min(f)
surf=sum(f)
p=sum(f>0)
z=sum(f==0)
x=sum(f<0)

function f
y=0;
for i=1:1:9999
y=y+1/(2*i-1);
t=y+1/(2*i+1);
if(y<3&&t>=3)
n=i;
strl= 'n=%d\n';
str2= 'y=%d\n';
fprintf(strl, n);
fprintf(str2, y);
else
continue
end
break
end
{ 2 x + 3 y − z = 2 8 x + 2 y + 3 z = 4 45 x + 3 y + 9 z = 23
2𝑥+3𝑦−𝑧=28𝑥+2𝑦+3𝑧=445𝑥+3𝑦+9𝑧=23 { 2 x + 3 y − z = 2 8 x + 2 y + 3 z = 4 45 x + 3 y + 9 z = 23 ⎩ ⎨ ⎧2x+3y−z=28x+2y+3z=445x+3y+9z=23
%法一:
a = [2,3,-1;8,2,3;45,3,9];%建立系数矩阵a
b = [2;4;23];%建立列向量b
x = inv(a)*b;%求解线性方程组
x = a\b;%更好的求解线性方程组
%法二:符号计算(出来的是分数)
syms x y z ;%建立符号变量
[x,y,z]=solve(2*x+3*y-z-2,8*x+2*y+3*z-4,45*x+3*y+9*z-23);
求多项式方程全部根:
2 𝑥 5 − 3 𝑥 3 + 71 𝑥 2 − 9 𝑥 + 13 = 0 2𝑥^5−3𝑥^3+71𝑥^2−9𝑥+13=0 2x5−3x3+71x2−9x+13=0
% 建立多项式系数向量
p = [2,0,-3,71,-9,13];
x = roots(p);
已知 x = 0 : 0.1 : 1 x=0:0.1:1 x=0:0.1:1
y = [ − 0.447 , 1.978 , 3.28 , 6.16 , 7.08 , 7.34 , 7.66 , 9.56 , 9.48 , 9.30 , 11.2 ] y=[-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2] y=[−0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2]
进行曲线拟合,说明拟合过程中多项式阶数的选择对拟合结果的影响,并给出较为合理的拟合多项式
x=0:0.1:1;
y=[-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2];
%最小二乘法计算拟合多项式系数。x,y为拟合数据向量,1为拟合多项式次数
%返回p1向量保存多项式系数,由最高次向最低次排列
p1=polyfit(x, y, 1);
%同上
p2=polyfit(x, y, 2);p3=polyfit(x, y, 3);
p4=polyfit(x, y, 4);p5=polyfit(x, y, 5);
p6=polyfit(x, y, 6);p7=polyfit(x, y, 7);
p8=polyfit(x, y, 8);p9=polyfit(x, y, 9);
x2=0:0.01:1;
%计算多项式的函数值。返回在x2处多项式的值,p1为多项式系数,元素按多项式降幕排序
y1=polyval(p1, x2);
%同上
y2=polyval (p2, x2);y3=polyval (p3, x2);
y4=polyval (p4, x2);y5=polyval (p5, x2);
y6=polyval (p6, x2);y7=polyval (p7, x2);
y8=polyval (p8, x2);y9=polyval (p9, x2);
%绘制出二维图形
subplot(2,2,1), plot(x,y,'b.',x2,y1); title('1次项拟合')
subplot(2,2,2), plot(x,y,'b.',x2,y2); title('2次项拟合')
subplot(2,2,3), plot(x,y,'b.',x2,y3); title('3次项拟合')
subplot(2,2,4), plot(x,y,'b.',x2,y4); title('4次项拟合')
subplot(2,2,1), plot(x,y,'b.',x2,y5); title('5次项拟合')
subplot(2,2,2), plot(x,y,'b.',x2,y6); title('6次项拟合')
subplot(2,2,3), plot(x,y,'b.',x2,y7); title('7次项拟合')
subplot(2,2,4), plot(x,y,'b.',x2,y8); title('8次项拟合')
subplot(2,2,1), plot(x,y,'b.',x2,y9); title('9次项拟合')


由图可知,拟和过程中,阶数的选择会对结果产生影响,根据图片可知,拟合到9阶时更符合实际,可得拟合函数: y = − 25310.019840 ∗ x 9 + 97461.688070 ∗ x 8 − 144937.774114 ∗ x 7 + 99325.865896 ∗ x 6 − 23869.268489 ∗ x 5 − 6795.149826 ∗ x 4 + 5009.481200 ∗ x 3 − 950.616690 ∗ x 2 + 77.440794 ∗ x 1 − 0.446088 ∗ x 0 y=-25310.019840*x^9+97461.688070*x^8-144937.774114*x^7+99325.865896*x^6-23869.268489*x^5-6795.149826*x^4+5009.481200*x^3-950.616690*x^2+77.440794*x^1-0.446088*x^0 y=−25310.019840∗x9+97461.688070∗x8−144937.774114∗x7+99325.865896∗x6−23869.268489∗x5−6795.149826∗x4+5009.481200∗x3−950.616690∗x2+77.440794∗x1−0.446088∗x0
x=[1 11 21 31 41 51 61 71 81 91 101];
y=[0 1.0414 1.3222 1.4914 1.6128 1.7076 1.7853 1.8513 1.9085 1.9590 2.0043];
p5=polyfit(x,y,5);
p=polyval(p5,x);
subplot(2,1,1);
plot(x,y,'r*-');
subplot(2,1,2);
plot(x,p,'g+--');
差值算法:
% 分段三次埃尔米特插值(Hermite interpolation)
x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = pchip(x,y,new_x);
figure(1); % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图
plot(x, y, 'o', new_x, p, 'r-')

X=[1 4 9 16 25 36 49 64 81 100];
Y=[1 2 3 4 5 6 7 8 9 10];
%函数根据X,Y的值,计算函数在50处的值
interp1(X,Y,50,'cubic')
%函数根据X,Y的值,计算函数在x处的值
x=1:100;
y=interp1(X,Y,x,'cubic')

x=6:2:18;%时间
Y1=[18.0,20.0,22.0,25.0,30.0,28.0,24.0];%室内温度
Y2=[15.0,19.0,24.0,28.0,34.0,32.0,30.0];%室外温度
y1=6.5:2:17.5;
m=interp1(x,Y1,y1,'spline')
n=interp1(x,Y2,y1,'spline')
subplot(2,1,1);
plot(y1,m,'r*-');
subplot(2,1,2);
plot(y1,n,'g+--');
合并同类项,指令:collect(s), collect(s,v)
syms x y
f = x^2*y+y*x-x^2-2*x;
collect(f)
collect(f,'y')
结果:
ans = (y - 1)*x^2 + (y - 2)*x
ans = (x^2 + x)*y - x^2 - 2*x
因式分解,指令: factor
化简指令:simplify和simple
syms x y
factor(x^2-y^2)
factor(x^3-y^3)
factor(x^4-y^4)
simplify(cos(x)^2+sin(x)^2)
simplify(cos(x)^2-sin(x)^2)
结果:
[x - y, x + y]
[x - y, x^2 + x*y + y^2]
[x - y, x + y, x^2 + y^2]
1
cos(2*x)
符号求极限:
符号极限指令:limit(函数 f 在 matlab 中是关于符号对象 x 的符号表达式)
limit(f,x,a) : 计算自变量x -> a时,函数 f的极限值.limit(f,a) : 计算由 findsym(f)确定的自变量->a时,函数 f的极限值.limit(f) : 计算a = 0时,函数 f的极限值.limit(f,x,a,'right') or limit(f,x,a,'left'):计算x->a时的右极限和左极限syms x y t h
f=sin(x)/x;
limit(f)
% ans = 1
limit((1+2*t/x)^(3*x), x, inf)
% ans = exp(6*t)
limit(1/x, x, 0, 'right')
% ans = Inf
limit(1/x, x, 0, 'left')
% ans = -Inf
limit((sin(x+h)-sin(x))/h, h, 0)
% sin(x)导数的概念
% ans = cos(x)
matlab符号微分指令:diff
syms x y
f=x^2+x*y+y^2+sin(x)+cos(y);
% 对x一阶导数?
dx1=diff(f)
% dx1 = 2*x+y+cos(x)
% 对x二阶导数?
dx2=diff(f, 2)
% dx2 = 2-sin(x)
% 对y一阶导数?
dy1=diff(f, y)
% dy1 = x+2*y-sin(y)
% 对y二阶导数?
dy2=diff(f, y, 2)
% dy2 = 2-cos(y)
% 计算函数f的n阶导数 (n=1,2,3,…)
% diff(f,n) or diff(f, y, n)
注意:
关于 diff,在不指定自变量的情况下,系统对x自变量求导;如函数(符号表达式)中没有x,系统将对最接近x的符号变量求导
符号积分指令:int—计算不定积分和定积分
syms x w t
int(1/x)
% ans = log(x)
int(1/x^2)
% ans = -1/x
int(sin(w*t), t) % 对t积分
% ans = -1/w*cos(w*t)
求解符号定积分,如验证积分:
∫ − τ 2 τ 2 A e − i ω t d t = A τ sin ω τ 2 ω τ 2 \int _{-\dfrac{\tau }{2}}^{\dfrac{\tau }{2}}Ae^{-i\omega t}dt=A\tau \dfrac{\sin \dfrac{\omega \tau }{2}}{\dfrac{\omega \tau }{2}} ∫−2τ2τAe−iωtdt=Aτ2ωτsin2ωτ
syms a t tao w;
% 求左边积分
yf=int(a*exp(-i*w*t), t, -tao/2, tao/2)
% 结果为 yf=-i*a*(-exp(-1/2*i*w*tao)+exp(1/2*i*w*tao))/w
% 将结果再化简
Yf=simple(yf)
Yf = 2*a*sin(1/2*w*tao)/w
% 与右端一致
代数方程的特点
matlab符号方法求解代数方程的指令:
linsolvesolve求方程组 u ∗ y 2 + v ∗ z + w = 0 , y + z + w = 0 u*y^2+v*z+w=0, y+z+w=0 u∗y2+v∗z+w=0,y+z+w=0 关于y, z的解
S=solve('u*y^2+v*z+w=0','y+z+w=0','y','z')
% S =
% y: [2x1 sym]
% z: [2x1 sym]
disp('S.y'),disp(S.y)
% S.y
% -1/2/u*(-2*u*w-v+(4*u*w*v+v^2-4*u*w)^(1/2))-w
% -1/2/u*(-2*u*w-v-(4*u*w*v+v^2-4*u*w)^(1/2))-w
disp('S.z'),disp(S.z)
% S.z
% 1/2/u*(-2*u*w-v+(4*u*w*v+v^2-4*u*w)^(1/2))
% 1/2/u*(-2*u*w-v-(4*u*w*v+v^2-4*u*w)^(1/2))
s=solve('(x+2)^x=2','x')
% s =
% .69829942170241042826920133106081
s=solve('(y+2)^y=2','y')
% s =
% .69829942170241042826920133106081
s=solve('(y+2)^a=2','a')
% s =
% log(2)/log(y + 2)
求定积分:
I = ∫ 0 1 x ln ( 1 + x ) d x I=\int ^{1}_{0}x\ln \left( 1+x\right) dx I=∫01xln(1+x)dx
%结果为小数
quad('x.*log(1+x)',0,1);
%符号运算(结果为分数)
syms x
int(x*log(1+x),0,1)
一些简单的表达式:
sin(45/180*pi) ;%算sin(45°),输出0.7071
x=[1 2 3;4 5 6];% 2X3 矩阵
%复数及其运算
z1=3+4*1i, z2=1+2*1i, z3=exp(1i*pi/6), z=z1*z2/z3
求这个表达式的值:
z = 1 2 ln ( x + 1 + x 2 ) , x = [ 2 1 + 2 i − 0.45 5 ] z=\dfrac{1}{2}\ln \left( x+\sqrt{1+x^{2}} \right),x=
[2−0.451+2𝑖5] [ 2 1 + 2 i − 0.45 5 ] z=21ln(x+1+x2 ),x=[2−0.451+2i5]
x=[2 1+2i;-0.45 5];
z=1/2*log(x+sqrt(1+x*x));
利用冒号表达式生成a向量,用点乘运算求各点的函数值:
a=-3.0:0.1:3.0;%第3题
% .*是2个向量对应元素相乘
z3=(exp(0.3.*a)-exp(-0.3.*a))/2.*sin(a+0.3)+log((a+0.3)/2);

x=0:0.5:2.5;
for i=1:length(x)
if x(i)>=0 && x(i)<1
y(i)=x(i)*x(i);
else if x(i)>=1 && x(i)<2
y(i)=x(i)*x(i)-1;
else
y(i)=x(i)*x(i)-2*x(i)+1;
end
end
end
disp(y)
从键盘输入一个4位整数,按如下规则加密后输出。加密规则:每位数字都加上7,然后用和除以10的余数取代该数字;再把第一位与第三位交换,第二位与第四位交换
%将一个1行4列且元素全为1的矩阵赋值给x
x=ones(1,4);
x(1)= input('请输入第一位数:');
x(2)= input('请输入第二位数;');
x(3)= input('请输入第三位数:');
x(4)= input('请输入第四位数:');
%rem(x,y):求整除x/y的余数
x=rem(x+7,10);
y=1000.*x(3)+100.*x(4)+10.*x(1)+x(2)

a=[-5,-3,0,1,2,2.5,3,5];
len=length(a);
for i=1:len
f(a(i))
end
function y=f(x)
if(x<0&&x~=-3)
y=x.*x+x-6
elseif(x>=0&&x<5&&x~=2&&x~=3)
y=x.*x-5*x+6;
else
y=x.*x-x-1;
end
end
输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中90-100分为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E,要求:
(1) 分别用if语句和swich语句实现。
(2) 输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息
function s(x)
if(x<0||x>100)
y=1;
else
if(x>=90&&x<=100)
y=2;
elseif(x>=80&&x<90)
y=3;
elseif(x>=70&&x<80)
y=4;
elseif(x>=60&&x<70)
y=5;
else
y=6;
end
end
switch y
case 1
disp('数据不合法');
case 2
disp('A');
case 3
disp('B');
case 4
disp('C');
case 5
disp('D');
case 6
disp('E');
end
硅谷公司员工的工资计算方法如下:
(1) 工作时数超过120小时者,超过部分加发15%;
(2) 工作时数低于60小时者,扣发700元;
(3) 其余按每小时84元计发。
试编程按输入的工号和该号员工的工时数,计算应发工资。
function y=csp_happycoding
m= input('请输入工号:')
n= input('请输入工时:')
if(n>=60&&n<120)
y=84*n;
elseif(n>=120)
y=84*120+(n-120)*1.15*84;
else
y=84*n-700;
end
csp_happycoding
从键盘输入一个4位整数,按如下规则加密后输出。
加密规则:每位数字都加上7,然后用和除以10的余数取代该数字;再把第一位与第三位交换,第二位与第四位交换。
%将一个1行4列且元素全为1的矩阵赋值给x
x=ones(1,4);
x(1)= input('请输入第一位数:');
x(2)= input('请输入第二位数;');
x(3)= input('请输入第三位数:');
x(4)= input('请输入第四位数:');
%rem(x,y):求整除x/y的余数
x=rem(x+7,10);
y=1000.*x(3)+100.*x(4)+10.*x(1)+x(2)
设计程序,完成两位数的加、减、乘、除四则运算
即:输入两个两位随机整数,再输入一个运算符号,做相应的运算,并显示相应的结果
m= input('请输入第一个随机数:');
n= input('请输入第二个随机数:');
z= input('请输入运算符号:','s');
if(z=='+')
y=m+n
elseif(z=='-')
y=m-n
elseif(z=='*')
y=m.*n
elseif(z=='/')
y=m/n
end
csp_happycoding
用函数的递归调用定义一个函数文件求 ∑ i = 1 n i m \sum ^{n}_{i=1}i^{m} ∑i=1nim
function a=f(n,m)
if(n<=1)
a=1;
else
a=f(n-1,m)+n^m;
end
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删