matlab孪生素数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对Matlab 的一组数据,可分为n类,每类数据分别使用一种处理方法,加工后的数据应保持和原始数据的对应关系,写出该问题在MATLAB中的一般表述方式。

算法描述:

1 确认数据(收集、采集、生成等)

2 确认n种条件及所对应的数据处理的n种方法(函数)

3 建立数据对应与n种条件的逻辑参考矩阵

4 根据n种逻辑参考矩阵分别选择对应的数据处理方法进行数据加工

5 确保加工处理后的输出数据和原始数据有相同的形态。

目的:学会在matlab中使用批量处理数据的方法。

算例:

1 数据采集

a=magic(5);

2 对n种条件,分别筛选出满足对应条件的逻辑矩阵d1,d2,d3,…,d与a同阶

d1=a<3; d2=a>=3 & a<9; d3=a>9;

3 从原数据中取出满足各条件的数据,分别存放至b1,b2,b3,…,b为列向量

b1=a(d1); b2=a(d2); b3=a(d3);

4 分别对各种条件下的数据作不同的处理

b1=b1*10; b2=b2*20; b3=b3*30;

5 获得最终结果,保持原数据形态,注意使用下标参考数据d

c=a;

c(d1)=b1; c(d2)=b2; c(d3)=b3;

a =

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

c =

510 720 10 160 450

690 100 140 420 480

80 120 390 600 660

300 360 570 630 60

330 540 750 20 9

b1 =[ 1 2]’

b2 =[ 4 5 6 7 8 3]’

b3 =[17 23 10 11 24 12 18 13 19 25 14 20 21 15 16 22]’

孪生素数问题:孪生素数指的是两素数差为2的相邻素数,最小的孪生素数是(3, 5)。编程求出n以内的孪生素数。

算法描述:

1 求出n以内的所有素数

2 计算相邻的两个素数之差

3 若差为2,则取出这对素数,存于一数组之中

4 显示该数组–孪生素数

目的:对于同一个算法,比较不同的程序处理方式在效果上的差异,如何利用软件所特有的优势,设计出更高效的程序。

编程一

function twinprimes=twinp(n)

a=primes(n);

j=length(a);

k=1;

for i=1:j-1

if a(i)+2 == a(i+1)

twinprimes (k,1)=a(i);

twinprimes (k,2)=a(i+1);

k=k+1;

end

end

twinprimes

编程二

function twinprimes=twinp(n)

p=primes(n);

s=[p(1:end-1);p(2:end)];

d=s(2,:)-s(1,:)==2;

twinprimes =s(:,d);

计算实例:

两个程序在取n=100,均有结果如下:

3 5 11 17 29 41 59 71

5 7 13 19 31 43 61 73

结果分析及结论:

采用同一种算法,但两种编程方式执行的效率却大有不同,测试当n=1000000时,方式一所需时间约为方式二的10倍;当n=10000000时,约为100倍。其原因在于方式一所用的循环语句(for)分支语句(if)在运行中耗时太多,与此同时,数组twinprimes在不停的扩维,也是耗时的;反观方式二的处理模式,由于其充分利用了向量化编程的特性,不仅所用语句少,而且执行效率也高许多。可见如何充分利用Matlab 的特点与优势是值得认真思考的,在程序中要尽量避免使用分支和循环语句,进而使程序更加简洁明了。

实际问题——>构造数学模型——>设计或选择计算方法——>算法详细描述——>程序设计——>上机计算——问题的解——>分析、验证结果及相关问题思考、扩展推广

误差分析:

例如:对于一般线性方程组AX=b,如果解X对b或A的扰动很敏感,则称方程组是病态的。

必须注重误差分析:一种合理的计算也可能得出错误的结果。

误差的来源:1.模型误差;2.测量误差;3.截断误差;4.舍入误差;

数值分析的主要讨论对象是截断误差和舍入误差。截断误差是计算误差中的主要部分;舍入误差的产生带有很大的随机性,在问题本身是病态的或算法稳定性不好时,就成为误差中主要部分了;测量误差作为初始的舍入误差。

训练有素的计算工作者,当发现计算结果与实际不符合时,应当能诊断出误差来源,并采取相应措施加以改进,直至建议修改数学模型。

[X,Y,Z]=sphere(30);

mesh(X,Y,Z)

hold on;

alpha=0:pi/50:2*pi;

x=cos(alpha); y=sin(alpha); plot(x,y,'-');

y=cos(alpha); x=zeros(size(y)); plot(x,y,'-'); hidden off

grid off

G := plot3d([sin(t)*cos(f), sin(t)*sin(f), 0], t = 0 .. 2*Pi, f = 0 .. 2*Pi);

H := plot3d([sin(t)*cos(s), cos(t)*cos(s), sin(s)], s = 0 .. 2*Pi, t = 0 .. 2*Pi);

with(plots);

display({G, H})

with(plots):

G := plot3d([sin(t)*cos(s), sin(t)*sin(s), 0], t = 0 .. 2*Pi, s = 0 .. 2*Pi, color = [255, 0, 0]);

H := plot3d([sin(t)*cos(s), cos(t)*cos(s), sin(s)], s = 0 .. 2*Pi, t = 0 .. 2*Pi, color = [0, 255, 0]); K := plot3d([sin(t)*cos(s), 0, 0], s = 0 .. 2*Pi, t = 0 .. 2*Pi, color = [0, 0, 255]);

L := plot3d([0, 0, 1.1*sin(s)], s = 0 .. 2*Pi, t = 0 .. 2*Pi, color = [0, 0, 0]);

M := plot3d([sin(t)*cos(s), cos(t)*cos(s), sin(s)], s = 0 .. Pi/2, t = 0 .. 2*Pi, color = [255, 255, 0]); display({G, H, K, L, M});

相关文档
最新文档