matlab孪生素数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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});