matlab计算表达式 k,刘卫国 Matlab 例题 1-3章

第一章

例1.1

分别绘制函数a4c26d1e5885305701be709a3d33442f.pnga4c26d1e5885305701be709a3d33442f.png的曲线。

x=-2*pi:pi/180:2*pi;

plot(x,2.^(-abs(x)),':',x,sin(x));

例1.2

求方程 2x5-3x3 +71x2-9x+13=0的全部根。

p=[2,0,-3,71,-9,13];

x=roots(p)

例1.3

求解线性方程组。

a4c26d1e5885305701be709a3d33442f.png

a=[2,3,-1;8,2,3;45,3,9];

b=[2;4;23];

x=inv(a)*b

例1.4 求积分a4c26d1e5885305701be709a3d33442f.png

quad('x.*log(1+x)',0,1)

第二章

例2.1 计算表达式

a4c26d1e5885305701be709a3d33442f.png的值,并将结果赋给变量x,然后显示出结果。

x=(5+cos(47*pi/180))/(1+sqrt(7)-2*i)

%计算表达式的值

例2.2 利用M文件建立MYMAT矩阵。

(1)启动有关编辑程序或MATLAB文本编辑器(见第4章),并输入待建矩阵:

MYMAT=[101,102,103,104,105,106,107,108,109;

201,202,203,204,205,206,207,208,209;

301,302,303,304,305,306,307,308,309];

(2)把输入的内容存盘(设文件名为mymatrix.m)。

(3)在MATLAB命令窗口中输入mymatrix,即运行该M文件,就会自动建立一个名为MYMAT的矩阵,可供以后使用。

例2.3 建立5阶方阵A,判断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

%判断A的元素是否可以被3整除

例2.4 在[0,3π]区间,求y=sin(x)的值。要求:

(1)消去负半波,即(π,2π)区间内的函数值置0。

(2) (a4c26d1e5885305701be709a3d33442f.png,a4c26d1e5885305701be709a3d33442f.png)和(a4c26d1e5885305701be709a3d33442f.png,a4c26d1e5885305701be709a3d33442f.png)区间内取值均为sina4c26d1e5885305701be709a3d33442f.png

方法1:

x=0:pi/100:3*pi;

y=sin(x);

y1=(x2*pi).*y;

%消去负半波

q=(x>pi/3&x<2*pi/3)|(x>7*pi/3&x<8*pi/3);

qn=~q;

y2=q*sin(pi/3)+qn.*y1;

%按要求处理第(2)步

方法2:

x=0:pi/100:3*pi;

y=sin(x);

y1=(y>=0).*y;

%消去负半波

p=sin(pi/3);

y2=(y>=p)*p+(y

%按要求处理第(2)步

例2.5 建立矩阵A,然后找出在[10,20]区间的元素的位置。

(1) 建立矩阵A。

A=[4,15,-45,10,6;56,0,17,-45,0]

A =

4

15

-45

10

6

56

0

17

-45

0

(2) 找出大于4的元素的位置。

find(A>=10 &

A<=20)

ans =

3

6

7

例2.6 建立一个字符串向量,然后对该向量做如下处理:

(1)取第1~5个字符组成的子字符串。

(2)将字符串倒过来重新排列。

(3)将字符串中的小写字母变成相应的大写字母,其余字符不变。

(4)统计字符串中小写字母的个数。

命令如下:

ch='ABc123d4e56Fg9';

subch=ch(1:5)

%取子字符串

subch =

ABc12

revch=ch(end:-1:1)

%将字符串倒排

revch =

9gF65e4d321cBA

k=find(ch>='a'&ch<='z');

%找小写字母的位置

ch(k)=ch(k)-('a'-'A');

%将小写字母变成相应的大写字母

char(ch)

ans =

ABC123D4E56FG9

length(k)

%统计小写字母的个数

ans =

4

第三章

例3.1

分别建立3×3、3×2和与矩阵A同样大小的零矩阵。

(1) 建立一个3×3零矩阵。

zeros(3)

ans =

0

0

0

0

0

0

0

0

0

(2)

建立一个3×2零矩阵。

zeros(3,2)

ans =

0

0

0

0

0

0

(3) 设A为2×3矩阵,则可以用zeros(size(A))建立一个与矩阵A同样大小零矩阵。

A=[1 2 3;4 5 6];

%产生一个2×3阶矩阵A

zeros(size(A))

%产生一个与矩阵A同样大小的零矩阵

ans =

0

0

0

0

0

0

例3.2

建立随机矩阵:

(1) 在区间[20,50]内均匀分布的5阶随机矩阵。

(2) 均值为0.6、方差为0.1的5阶正态分布随机矩阵。

x=20+(50-20)*rand(5)

y=0.6+sqrt(0.1)*randn(5)

例3.3

将101~125等25个数填入一个5行5列的表格中,使其每行每列及对角线的和均为565。

M=100+magic(5)

例3.4

求4阶希尔伯特矩阵及其逆矩阵。

命令如下:

format rat

%以有理形式输出

H=hilb(4)

H=invhilb(4)

format short

%恢复默认输出格式

例3.5

求(x+y)5的展开式。

pascal(6)

例3.6

先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,…,第五行乘以5。

A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;...

11,18,25,2,19];

D=diag(1:5);

D*A

%用D左乘A,对A的每行乘以一个指定常数

例3.7 求方阵A的逆矩阵,且验证A与A-1是互逆的。

A=[1,-1,1;5,-4,3;2,1,1];

B=inv(A);

A*B

B*A

例3.8 用求逆矩阵的方法解线性方程组。

a4c26d1e5885305701be709a3d33442f.png

A=[1,2,3;1,4,9;1,8,27];

b=[5,-2,6]';

x=inv(A)*b

也可以运用左除运算符“\”求解线性代数方程组。例如,本例也可以用下面的命令求解:

A=[1,2,3;1,4,9;1,8,27];

b=[5,-2,6]';

x=A\b

例3.9

用求特征值的方法解方程。

3x5-7x4+5x2+2x-18=0

p=[3,-7,0,5,2,-18];

A=compan(p);

%A的伴随矩阵

x1=eig(A)

%求A的特征值

x2=roots(p)

%直接求多项式p的零点

第四章

例4.1

建立一个命令文件将变量a,b的值互换,然后运行该命令文件。

程序1:

首先建立命令文件并以文件名exch.m存盘:

clear;

a=1:10;

b=[11,12,13,14;15,16,17,18];

c=a;a=b;b=c;

a

b

然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。

程序2:

首先建立函数文件fexch.m:

function [a,b]=exch(a,b)

c=a;a=b;b=c;

然后在MATLAB的命令窗口调用该函数文件:

clear;

x=1:10;

y=[11,12,13,14;15,16,17,18];

[x,y]=fexch(x,y)

例4.2 求一元二次方程ax2+bx+c=0的根。

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)];

disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);

例4.3 计算分段函数:

a4c26d1e5885305701be709a3d33442f.png

x=input('请输入x的值:');

if x==10

y=cos(x+1)+sqrt(x*x+1);

else

y=x*sqrt(x+sqrt(x));

end

y

也可以用单分支if语句来实现:

x=input('请输入x的值:');

y=cos(x+1)+sqrt(x*x+1);

if x~=10

y=x*sqrt(x+sqrt(x));

end

y

或用以下程序:

x=input('请输入x的值:');

if x==10

y=cos(x+1)+sqrt(x*x+1);

end

if x~=10

y=x*sqrt(x+sqrt(x));

end

y

例4.4输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。

c=input('请输入一个字符','s');

if c>='A' &

c<='Z'

disp(setstr(abs(c)+abs('a')-abs('A')));

elseif c>='a'&

c<='z'

disp(setstr(abs(c)-

abs('a')+abs('A')));

elseif c>='0'&

c<='9'

disp(abs(c)-abs('0'));

else

disp(c);

end

例4.5 某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):

price<200

没有折扣

200≤price<500

3%折扣

500≤price<1000

5%折扣

1000≤price<2500

8%折扣

2500≤price<5000

10%折扣

5000≤price

14%折扣

输入所售商品的价格,求其实际销售价格。

price=input('请输入商品价格');

switch fix(price/100)

case

{0,1}

%价格小于200

rate=0;

case

{2,3,4}

%价格大于等于200但小于500

rate=3/100;

case

num2cell(5:9)

%价格大于等于500但小于1000

rate=5/100;

case

num2cell(10:24)

%价格大于等于1000但小于2500

rate=8/100;

case

num2cell(25:49)

%价格大于等于2500但小于5000

rate=10/100;

otherwise

%价格大于等于5000

rate=14/100;

end

price=price*(1-rate)

%输出商品实际销售价格

例4.6 矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

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

%显示出错原因

例4.7 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。

for m=100:999

m1=fix(m/100);

%求m的百位数字

m2=rem(fix(m/10),10);

%求m的十位数字

m3=rem(m,10);

%求m的个位数字

if m==m1*m1*m1+m2*m2*m2+m3*m3*m3

disp(m)

end

end

例4.8 已知

a4c26d1e5885305701be709a3d33442f.png,当n=100时,求y的值。

y=0;n=100;

for i=1:n

y=y+1/i/i;

end

y

在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:

n=100;

i=1:n;

f=1./i.^2;

y=sum(f)

例4.9 设a4c26d1e5885305701be709a3d33442f.png,求s=a4c26d1e5885305701be709a3d33442f.png

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a; s=0;

f0=exp(-0.5*x)*sin(x+pi/6);

for i=1:n

x=x+h;

f1=exp(-0.5*x)*sin(x+pi/6);

s=s+(f0+f1)*h/2;

f0=f1;

end

s

上述程序来源于传统的编程思想。也可以利用向量运算,从而使得程序更加简洁,更赋有MATLAB的特点。程序如下:

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a:h:b;

f=exp(-0.5*x).*sin(x+pi/6);

for i=1:n

s(i)= (f(i)+f(i+1))*h/2;

end

s=sum(s)

例4.10 写出下列程序的执行结果。

s=0;

a=[12,13,14;15,16,17;18,19,20;21,22,23];

for k=a

s=s+k;

end

disp(s');

例4.11 从键盘输入若干个数,当输入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

例4.12 根据矩阵指数的幂级数展开式求矩阵指数。

a4c26d1e5885305701be709a3d33442f.png

X=input('Enter X:');

E=zeros(size(X));

F=eye(size(X));

n=1;

while norm(F,1)>0

E=E+F;

F=F*X/n;

n=n+1;

end

E

expm(X)

%调用MATLAB矩阵指数函数求矩阵指数

例4.13 求[100,200]之间第一个能被21整除的整数。

for n=100:200

if rem(n,21)~=0

continue

end

break

end

n

例4.14 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。

例4.15 用筛选法求某自然数范围内的全部素数。

m=input('m=');

p=1:m; p(1)=0;

for i=2:sqrt(m)

for

j=2*i:i:m

p(j)=0;

end

end

n=find(p~=0);

p(n)

关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:

m=input('m=');

p=2:m;

for i=2:sqrt(m)

n=find(rem(p,i)==0&p~=i);

p(n)=[];

end

p

例4.16 编写函数文件求半径为r的圆的面积和周长。

函数文件如下:

function [s,p]=fcircle(r)

%CIRCLE

calculate the area and perimeter of a circle of radii r

%r

圆半径

%s

圆面积

%p

圆周长

06年2月30日编

s=pi*r*r;

p=2*pi*r;

将以上函数文件以文件名fcircle.m存盘,然后在MATLAB命令窗口调用该函数:

[s,p]=fcircle(10)

例4.17 利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。

函数文件tran.m:

function [rho,theta]=tran(x,y)

rho=sqrt(x*x+y*y);

theta=atan(y/x);

调用tran.m的命令文件main1.m:

x=input('Please input

x=:');

y=input('Please input y=:');

[rho,the]=tran(x,y);

rho

the

例4.18 利用函数的递归调用,求n!。

function f=factor(n)

if n<=1

f=1;

else

f=factor(n-1)*n;

%递归调用求(n-1)!

end

在命令文件main2.m中调用函数文件factor.m求s=1!+2!+3!+4!+5!。

s=0;

for i=1:5

s=s+factor(i);

end

s

例4.19 任意排列问题。MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。

function Y=rndprm1(X)

%RNDPRM1

用for循环产生一个行向量的任意排列

%RNDPRM1(X)产生行向量X的任意排列

[m,n]=size(X);

if m>1

error('RNDPRM1 accepts as inputs only

vectors');

end

Y=[];

%从一个空矩阵开始

l=n;

%X的元素个数

for i=1:n

k=1+fix(l*rand);

%随机选择Y的下一个元素的位置

x=X(k);

%被选择的元素

Y=[Y,x];

%将X添加到Y中

X(k)=[];

%从X中删除x元素

l=l-1 ;

%更新X的元素个数

end

第二个程序用函数的递归调用:

function Y=rndprm2(X)

%RNDPRM2

用递归调用产生一个行向量的任意排列

%RNDPRM2(X)产生一个X的任意排列

[m,n]=size(X);

l=n;

if m>1

error('RNDPRM2 accepts as inputs only

vectors')

end

if n<=1

Y=X;

else

k=1+fix(l*rand);

%随机选择Y的下一个元素的位置

x=X(k);

%被选择的元素

X(k)=[];

%从X中删除x元素

Z=rndprm2(X);

%将剩下的元素随机排列

Y=[Z,x];

%构造输出向量

l=l-1;

end

例4.20 nargin用法示例。

函数文件examp.m:

function fout=charray(a,b,c)

if nargin==1

fout=a;

elseif nargin==2

fout=a+b;

elseif nargin==3

fout=(a*b*c)/2;

end

命令文件mydemo.m:

x=[1:3];

y=[1;2;3];

examp(x)

examp(x,y')

examp(x,y,3)

例4.21 全局变量应用示例。

先建立函数文件wadd.m,该函数将输入的参数加权相加。

function f=wadd(x,y)

global ALPHA BETA

f=ALPHA*x+BETA*y;

在命令窗口中输入:

global ALPHA BETA

ALPHA=1;

BETA=2;

s=wadd(1,2)

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 本题要求用Matlab程序实现一个算法,并给出对应的应用场景。 可能的答案: 这个问题要求我们设计一个能够解决实际问题的Matlab程序,并且给出应用场景。我认为,这个问题非常有趣。 在Matlab中,可以使用各种算法来解决不同的实际问题。对于本题,我想采用机器学习算法来实现一个聚类分析程序。这个程序可以将一个数据集中的数据点分成若干个不同的簇,每个簇代表一组相似的数据点。这个算法在许多领域中都有应用,例如社交网络分析,市场调查等等。 在这个应用场景中,我们可以使用该程序来分析用户在社交网络中的行为模式,并将其分成不同的群组,例如职业、年龄、兴趣等等。这个程序还可以应用于电子商务网站,将用户按购买记录、浏览记录等分类,以便为用户推荐更精准的商品。 总之,Matlab中有许多有趣的算法和应用场景,我们可以通过编写程序来探索它们,打造出更好的解决方案。 ### 回答2: 题目:编写一个Matlab程序,首先随机生成一个1到100之间的整数,然后让用户输入一个猜测的数字,程序要用循环结构进行判断,直到猜测正确为止,并且输出总共猜测了几次。 答案: 首先,我们需要使用randi函数随机生成一个1到100之间的整数,代码如下: N = randi([1 100],1,1); %生成一个1到100之间的整数 然后,我们需要使用while循环来进行猜数游戏,每次循环需要让用户输入一个猜测的数字,并且进行判断,如果猜测正确就退出循环,如果猜测错误就继续循环到猜测正确为止。我们可以使用if语句进行判断,代码如下: n = 0; %初始化猜测次数为0 guess = 0; %初始化猜测数为0 while guess ~= N %循环进行猜数游戏 n = n+1; %每次循环猜测次数加1 guess = input('请猜一个1到100之间的整数:'); %让用户输入猜测数 if guess == N %如果猜测正确就输出猜测次数并退出循环 fprintf('恭喜你猜对了!你共猜了%d次。\n', n); break; elseif guess > N %如果猜测数大于目标数就提示猜小一点 fprintf('你猜的数太大了,请猜小一点。\n'); else %如果猜测数小于目标数就提示猜大一点 fprintf('你猜的数太小了,请猜大一点。\n'); end end 最后,我们运行以上代码,就可以进行猜数游戏了。可以多次进行游戏测试,查看程序是否正确。 ### 回答3: 习题1: 设计一个程序,判断一个数是否为某些特定数的倍数,该特定数的集合由用户输入。 答案: 该题需要用到matlab的输入输出函数,方便用户输入和程序输出。具体实现如下: ``` % 输入特定数的集合 numSet = input("请输入特定数的集合(用逗号隔开):"); % 输入需要判断是否为倍数的数 num = input("请输入需要判断是否为倍数的数:"); % 判断是否为特定数的倍数 flag = 0; % 标记是否为倍数 for i = 1:length(numSet) if mod(num, numSet(i)) == 0 flag = 1; break; end end % 输出结果 if flag == 1 disp([num "是特定数集合的倍数"]); else disp([num "不是特定数集合的倍数"]); end ``` 该程序首先通过输入函数获取特定数的集合和需要判断是否为倍数的数,然后通过for循环遍历特定数的集合,如果存在某一个数可以整除需要判断的数,则将flag标记为1,退出循环。最后通过条件判断输出结果。 需要注意的是,输入函数获取的集合是一个字符串类型,需要用split函数将其划分成一个元素为字符串的cell类型的数组,然后通过循环转换成double类型的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值