MATLAB实验四 数字填图问题

合集下载

MATLAB数字图像地腐蚀、填充、细化与粗化

MATLAB数字图像地腐蚀、填充、细化与粗化

《数字图像处理》实验报告学号专业电子科学与工程学院实验 5一、实验目的本次实验的处理对象是二值图像,关于二值图像的处理运算主要包括腐蚀和膨胀。

它们是其他处理过程的主要运算环节。

开闭操作通过腐蚀和膨胀的不同顺序组合,能够使图像平滑,开闭操作再组合能够成噪声滤波器。

形态学中的击中击不中变换也应用了腐蚀的运算,用于判断图像中能否找到目标结构,这在图像细化中也得到了应用。

本次实验主要实现:1.图像的边缘提取;2.在边缘提取的根底上实现区域填充;3.在区域填充的根底上实现图像细化;4.在图像细化的根底上实现图像粗化。

在Matlab软件的自带函数库中其实本身就包含有以上处理过程的函数,为了深入理解每种处理过程的原理,本次实验所有运算都自行编写实现。

二、核心代码与运行后截图主函数:%% 读取图像clear;clc;I = imread('onepiece.jpg');I = im2bw(I); % 转换为二值图像[m,n] = size(I);%% 边界提取f = im2bw([0,1,0;1,1,1;0,1,0]); % 腐蚀用的结构元素F = fs(I,f);BW = im2bw(I-F); % 用原图减去腐蚀获得边缘figure;imshow(I);title('原图');figure;imshow(F);title('腐蚀图像');figure;imshow(BW);title('边界');在上面的运行效果图上看来,由于原图选择的原因,周围一圈白线有一定宽度但不足够粗,大概只有2~3个像素宽度而腐蚀用元素大小为3×3,这导致腐蚀后图像留下的白线看起来残缺不全,用原图减去腐蚀后得到的边缘图像也在白线处有“粘在一块〞的现象。

只要使用更高一些分辨率的图片即可防止这样的情况。

但出于后续试验的运行速度考虑,本实验就使用此图〔300×300〕。

matlab 图像编码+答案

matlab 图像编码+答案

实验四图像编码一、实验目的了解图像压缩编码的分类与评价指标;掌握常用的熵编码方法以及matlab编程;掌握基于FFT的图像压缩技术以及matlab编程;掌握基于DCT的图像压缩技术以及matlab编程;熟悉JPEG图像压缩编码过程;掌握imwrite函数实现可变quality的JPEG压缩;二、实验内容(1)对给定的图像tu.bmp,进行哈夫曼编码,并解码输出,观察workspace下各个矩阵数据。

h=imread('tu.bmp');[m,n]=size(h);subplot(1,2,1);imshow(h);title('yuantu');h=h(:);s=0:255;for i=0:255p(i+1)=length(find(h==i))/(m*n);enddict=huffmandict(s,p);enco=huffmanenco(h,dict);deco=huffmandeco(enco,dict);deco=col2im(deco,[m,n],[m,n],'distinct');subplot(1,2,2);imshow(uint8(deco));title('huffman');(2)阅读jpeg压缩编码的有关资料,使用imwrite函数对lena图像进行jpeg压缩,对比显示原图与不同质量参数下解码后的图像,并显示均方根误差、压缩比、图像大小x=imread('lena.bmp');imwrite(x,'c:/lena1.jpg','quality',20);imwrite(x,'c:/lena2.jpg','quality',60);imwrite(x,'c:/lena3.jpg','quality',80);x1=imread('c:/lena1.jpg');k1=imfinfo('c:/lena1.jpg');s1=k1.FileSize/1024;e1=x(:)-x1(:);[m1,n1]=size(e1);erms1=sqrt(sum(e1(:)).^2/(m1*n1));i_size1=k1.Width*k1.Height*k1.BitDepth/8;i_compress1=k1.FileSize;ratio1=i_size1/i_compress1;subplot(221);imshow(x1);title('质量因子:20 均方根误差:722.793 压缩比:14.448 图像大小:4536');x2=imread('c:/lena2.jpg');k2=imfinfo('c:/lena2.jpg');s2=k2.FileSize/1024;e2=x(:)-x2(:);[m2,n2]=size(e2);erms2=sqrt(sum(e2(:)).^2/(m2*n2));i_size2=k2.Width*k2.Height*k2.BitDepth/8;i_compress2=k2.FileSize;ratio2=i_size2/i_compress2;subplot(222);imshow(x2);title('质量因子:60 均方根误差:454.8008 压缩比:7.416 图像大小:8837');x3=imread('c:/lena3.jpg');k3=imfinfo('c:/lena3.jpg');s3=k3.FileSize/1024;e3=x(:)-x3(:);[m3,n3]=size(e3);erms3=sqrt(sum(e3(:)).^2/(m3*n3));i_size3=k3.Width*k3.Height*k3.BitDepth/8;i_compress3=k3.FileSize;ratio3=i_size3/i_compress3;subplot(223);imshow(x2);title('质量因子:80 均方根误差:343.2344 压缩比:5.0451 图像大小:12990');(3)读取lena图像,编写一个程序,实现下列算法:首先将图像分成许多8X8的子图像,对每个子图像进行DCT,对每个子图像的64个系数,按照每个系数的大小来排序后,舍去小的变换系数,只保留16个系数,实现图像4:1的压缩%读取lena图像,编写一个程序,实现下列算法:首先将图像分成许多8X8的子图像,对每个子图像进行DCT,%对每个子图像的64个系数,按照每个系数的大小来排序后,舍去小的变换系数,只保留16个系数,实现图像4:1的压缩cr=0.25;i=imread('lena.bmp');i1=double(i)/255;subplot(121);imshow(i1);t=dctmtx(8);dctcoe=blkproc(i1,[8 8],'P1*x*P2',t,t');coevar=im2col(dctcoe,[8 8],'distinct');coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar);snum=64-64*cr;for i=1:ncoe(ind(1:snum),i)=0;endb2=col2im(coe,[8 8],[256 256],'distinct');i2=blkproc(b2,[8 8],'P1*x*P2',t',t);subplot(122);imshow(i2);%e=double(i1)-double(i2);%[m,n]=size(e);三、涉及知识点(1)哈夫曼具体的编码方法为:把输入元素按其出现概率的大小顺序排列起来,然后把最末两个具有最小概率的元素之概率加起来;②把该概率之和同其余概率由大到小排队,然后再把两个最小概率加起来,再重新排队;③重复②,直到最后只剩下两个概率为止matlab函数:huffumandict函数:生成哈夫曼编码字典使用格式dict=huffmandict(s,p) s为灰度级,p为各灰度级出现的概率huffmanenco函数:对图像进行哈夫曼编码使用格式: enco=huffmanenco(I,dict);I为图像数据转成的列向量,dict为哈夫曼编码字典Huffmandeco函数:对编码进行解码使用格式:deco=huffmandeco(enco,dict);enco为压缩编码,dict为哈夫曼编码字典(2)JPEG图像编码过程(3)fft2函数:图像的二维快速傅立叶变换,语法格式:F=fft2(I),能够将图像从空间域变换到频率域ifft2函数:图像的二维快速傅立叶变换逆变换函数,语法格式:I=fft2(F),能够将图像从频率域变换到空间域(4)blkproc函数:能够将每个显示块从图像中提取出来,然后将其作为参数传递给任何用户函数。

(完整word版)MATLAB实验四 数字填图问题

(完整word版)MATLAB实验四 数字填图问题

实验四数字填图问题一、问题背景和实验目的数字填图问题是数学问题的一种趣味形式.早在19世纪后半期,一些数学家就在报刊中大量使用数字填图游戏和字谜游戏等,目的是使业余爱好者也能通过简单的形式去认识、理解和琢磨深奥的数学问题,这些问题中甚至包括困惑了世间智者350多年、于1994年才刚刚被证明了的“费马大定理”.100多年来,数字填图问题对数学界所起的作用是不言而喻的.大家都知道,数学问题一般都经过严格的逻辑证明才得以解决.而逻辑证明是指从一些公理出发,经过逻辑推理来证明问题.但随着20世纪40年代以来计算机的诞生和发展,计算机改变了整个世界,计算机已在各个领域发挥作用,并取得了许多重大进展.于是,能否用计算机来证明数学问题便成了大家关心的话题.所谓计算机证明是指充分发挥计算机计算速度快和会“推理”的特点,用计算机程序模拟解题或进行穷举检验,最后得到问题的解.几乎所有的数学家对计算机证明持保留态度,因为他们相信,只有逻辑证明才是真正可靠的.但“四色问题”的证明,又使他们感到困惑,因为“四色问题”的证明实际上是一个计算机证明.能否用计算机来证明数学问题的争论可能会持续一个相当长的时间,本实验旨在通过生活中几个常见的数字填图问题的探究,谈谈这类问题的逻辑推理解法和计算机解法.二、相关函数(命令)简介1.cputime命令:记录执行本命令时的Matlab时钟的时间(秒).2.tic命令:开始计时.3.toc命令:结束计时.4.disp(x):输出矩阵x.x的各项应为字符,所以在输出时要进行转化.相关的命令有:num2str( ):把数值转化为字符;mat2str( ):把矩阵转化为字符.5.fopen(filename, mode):用mode方式打开/建立filename文件,以备写入数据,使用方式:fid = fopen(filename, mode).6.fclose(fid):关闭上述文件.例如下列程序是把一个两行的矩阵y写入文件output.dat:x=0:0.1:1;y=[x;exp(x)];fid=fopen(’output.dat’,’wt’);fprintf(fid,’ x exp(x)\n’);fprintf(fid,’%6.2f %12.8f\n’,y);%实际得到的是矩阵y的转置矩阵status=fclose(fid);与C语言的文件操作方式相类似.三、 实验内容让我们先从一个简单的问题出发来谈谈数字填图问题的两种解法.然后通过几个稍复杂问题的探究,从中展示逻辑推理的严谨以及计算机解法的魅力,启迪我们去解决更复杂的数学问题.注:在本实验中,将表达式 abc 理解为 abc ,即 100*a +10*b +c ,其余类似,不另加说明.(一)、一个简单的问题及其解答问题一:在图 1 的几个加法等式中,每个□表示一个非零数字,任意两个数字都不相同,问有多少个解?图1【逻辑解法】 为简洁起见,将它的 3 个式子记作: a + b = c ,d + e = f ,g + h = i 0,若问题有解,则显然有 i = 1,且(a + b ) + (d + e ) + (g + h ) = c + f + i ⨯ 10,故 45 = (a + b + c ) + (d + e + f ) + (g + h + i ) = 2 (c + f ) + i ⨯ 11,即 c + f = 17,故 c = 8,f = 9 或 c = 9,f = 8.考虑到 a ~ i 互不相同,当要求 a < b ,d < e ,g < h 时,有如下 4 组解(见下表):注:本问题实际上仅有 2 个解是本质的,即表中的第 2、3 行,第 4、5 行所代表的解仅是位置不同而已.如不要求 a < b ,d < e ,g < h ,则解的个数是 1212124C C C 个.【计算机解法】为验证此结果,可用 Mathematica 、Matlab 、Turbo C 等软件进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题解的情况恰如上所述.用 Matlab 实现的程序清单可参见附录1,这一算法比较慢(一个更慢的算法参见附录1B ,试分析其原因),而一个提速的程序清单可参见附录2,Turbo C 程序清单可参见附录3,而Mathematica 程序清单可参见附录4.【评论】这个问题的逻辑解法十分简单,或许根本不需要计算机解法,但所用程序有一定的代表性,稍加修改即可解决一系列问题,这点可从下面的问题中看到.(二)、几个较复杂的问题及其解答问题二:在图 2 的 4 个算式中,每个□表示一个非零数字,任意两个数字都不相同,问(A)、(B)、(C) 和(D) 这4 种情形分别有多少个解?图2讨论:显然,情形(C)无解.情形(D) 与情形(C) 实际上是同一个问题,因此也无解.情形(B)与情形(A)实际上也是同一个问题.我们先讨论情形(A)的解的个数.【逻辑解法】为简洁起见,将此竖式记作:abc + def = ghi,即,其中 a~ i 代表1~ 9 这9 个互不相同的非零数字.据九余数性质可知,两个“加数”中的六个数字之和被9 除的余数应等于“和数”中的三个数字之和被9 除的余数.又这两个“加数”与“和数”中共九个数字正好是1,2,⋅⋅⋅,9,它们的和为45,被9 除的余数是0,易见“和数”的三个数字之和被9 除的余数必为0,也即:“和数”是9 的倍数.注意到题设可知,“和数”的三个数字之和必定为:g + h + i = 9 或g + h + i = 18.<1> 考虑g + h + i = 9 的情形.(1) 首先必定有g > 3,否则{a,d} 最小为{1,2},{b,e} 最小为{4,5},{c,f} 最小为{6,7},此时已有abc + def > 400,与g ≤ 3 矛盾.故g≥ 4;另外,g≤ 6 为显然;(2) 若g = 4,由g + h + i = 9,h + i = 5,故{h,i} 最小为{1,4} 或{2,3};但已有g = 4,故{h,i} 为{2,3},而{a,d} 最小为{1,4},从而g≥5,与g = 4 矛盾;(3) 若g = 5,由g + h + i = 9,h + i = 4,故{h,i} 为{1,3};而{a,d} 最小为{2,4},从而g≥ 6,与g = 5 矛盾;(4) 若g = 6,由g + h + i = 9,h + i = 3,故{h,i} 为{1,2};而{a,d} 最小为{3,4},从而g≥ 7,与g = 6 矛盾.综上所述,g + h + i = 9 的情形下问题无解.<2> 考虑g + h + i = 18 的情形.由于g≥ 4(理由同上),以下按g = 9,8,⋯,4 的顺序分类讨论:(1) g = 9,则h + i = 9.由于a ~ i互不相同,于是g,h,i的可能的取值见下表:对这些竖式有序地交换两个加数的百位数、十位数和个位数,可得到每个类型的 8(=121212C C C ) 个不同竖式 (解),小计有解 12 ⨯ 8 = 96 个. 注意:表中的第 2、5、6、9 列为容易造成失解的地方,要特别留意. 完全类似地有如下一系列过程:(2) g = 8,则 h + i = 10.仿(1),小计有解 10⨯8=80 个,解例见下表:(3) g = 7,则 h + i = 11.小计有解 5⨯8=40 个,解例见下表:(4) g = 6,则 h + i = 12.小计有解 6⨯8=48 个,解例见下表:(5) g = 5,则 h + i = 13.小计有解 5⨯8=40 个,解例见下表:(6) g = 4,则 h + i = 14.小计有解 4⨯8=32 个,解例见下表:结论:本问题的解的个数为:(12 + 10 + 5 + 6 + 5 + 4) ⨯ 8 = 42 ⨯ 8 = 336.注:<1>如不考虑两个加数的上下位置关系,则总的解的个数为:42 ⨯ 8/2 = 168.<2>由于情形(B) 与情形(A)是同一个问题,故解的个数也为:42 ⨯ 8 = 336.【计算机解法】为验证此结果,仍用Matlab、Mathematica、Turbo C 编程进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题有且只有336 个不同竖式(解),而Matlab 程序清单可参见附录5,你可发现它与附录1 十分相似.【评论】这个问题的逻辑解法较复杂,而计算机解法则是如此的简单快捷,运行整个程序不要 1 分钟.实际上非常复杂的“四色问题”的证明也是这样:对1482 种有代表性地图的分析,若依靠人工去做,可能要几十年甚至上百年的时间,而用计算机,只要1200 小时即告完成.这还是70 年计算机的计算水平,若用现在的计算机,计算时间应该不会超过一天!问题三:在图 3 的加法算式中,每个□表示一个非零数字,任意两个数字都不相同,问可有多少个解?【逻辑解法】为简洁起见,将此竖式记作:a + bc + def = ghi或,其中a ~ i代表1~ 9 这9 个互不相同的非零数字.据九余数性质并采用完全类似问题二的讨论可知,“和数”的三个数字之和必定为:g + h + i = 9 或g + h + i = 18.同时,g≠ 1,否则 d = 1;另外g > d,从而g = d + 1.由于9 ≥ g ≥ 2,以下按g = 9,8,7,⋅⋅⋅,2 的顺序分类讨论:(0) g = 9,d = 8.则h + i = 9.由于a ~ i互不相同,于是g,h,i的可能的取值为(见下表):图3小计有解0 个.(1) g = 8,d = 7.则h + i = 1(不可能,舍去) 或h+i=10.由于a ~ i互不相同,于是g,h,i的可能的取值为(见下表):对这些竖式有序地交换三个加数的个位数、两个加数的十位数,可得到每个类型的12 个不同竖式(解),小计有解2⨯12=24 个.完全类似地有如下一系列过程:(2) g = 7,d = 6.则h + i = 2(不可能,舍去) 或h+i=11.仿(1),小计有解2⨯12=24 个.(3) g = 6,d = 5.则h + i = 3 或h + i = 12.有解1⨯12=12 个,解例见下表:(4) g = 5,d = 4.则h + i = 4 或h + i = 13.有解3⨯12=36 个,解例见下表:(5) g = 4,d = 3.则h + i = 5 或h + i = 14.有解2 ⨯ 12 = 24 个,解例见下表:(6) g = 3,d = 2.则 h + i = 6 或 h + i = 15.有解 2 ⨯ 12 = 24 个,解例见下表:(7) g = 2,d = 1.则 h + i = 7 或 h + i = 16.有解 2 ⨯ 12 = 24 个,解例见下表:结论:本问题的解的个数为:(2 + 2 + 1 + 3 + 2 + 2 + 2) ⨯ 12 = 168.【计算机解法】让我们再尝试计算机解法.仍用 Matlab 、Mathematica 、TurboC 编程进行穷举法验证,程序清单类似于附录1~附录5,不再另附.运行结果表明本问题的确有且只有 168 个不同竖式(解),要说明的是:该程序在一般的计算机上运行一次也只需不到 1 分钟.【评论】也许有人会说,你的问题还仅是一个有穷的问题,象“费马大定理”这样的无穷问题,你的计算机就无能为力了! 情况或许是这样.但应该注意到:非常复杂的“四色问题”也是一个无穷问题,但妙就妙在有人能将它们缩小到 1482 种有代表性地图以内,从而成为一个有穷的问题!至此,对于计算机解题的作用恐怕再不能视而不见了! 下面的两个问题也是成功地运用计算机解题的的一些典型例子,而至少到目前为止还没有看到它们的推理解法.问题四:图 4 的加法等式是:两个真分数之和等于第三个真分数,每个□表示一个不为 0 的数字,任意两个数字都不相同.比如:847965321=+,试找出所有可能的解.图4【计算机解法】本问题利用计算机程序已找到解答,共有10 个解.解答请参见:《数学教学》(华东师范大学)1994 年第 5 期.【评论】程序如何编? 看起来问题似乎很简单,只要将附录1~附录5 稍加修改即可.例如可利用附录 6 的Matlab 程序进行计算.但实际情况让我们大吃一惊:用Matlab 程序居然只有6 个解!还有 4 个解到哪里去了?用Turbo C 程序编写出的类似的程序居然只有7(或9)个解!还有3(或1)个解到哪里去了?还有人用Turbo C 程序编写出的类似的程序,却居然得到了11 个“解”!这个多出的 1 个“解”是哪里来的?类似的问题还会发生在本实验的“四、自己动手”的第 6 题中,用不同的语言编写出的类似程序,其运行结果居然差距很大,你能明白其中的道理吗?根据观察,可能是浮点问题,也可能是整数的上界问题,或别的什么原因.具体什么原因,留作思考题.问题五:图 5 的加法等式是:两个假分数之和等于第三个假分数,每个□表示一个不为0 的数字,任意两个数字都不相同.试找出所有可能的解.图5【计算机解法】本问题利用计算机程序也已找到解答,共有41个解.同样只要将附录1~5的程序稍加修改即可.(三)、小结数字填图问题是一种活泼的、变形的数学问题,逻辑推理是这类问题的一般解法.但也有若干数字填图问题要找到这样的逻辑推理解法是非常地困难,而采用计算机解法则轻而易举.问题一和问题二就是这样的例子.至于问题四和问题五则只能给出计算机解法.尽管数学家们很难接受计算机解法,因为他们担心计算机会出错(尽管这种出错的概率几乎为零!),更重要的是他们坚信逻辑证明是解答这类问题的根本方法.但上述事实证明计算机解法也是十分有效的.另一个公认的例子是“四色问题”,它的证明实际上就是一个计算机证明.关于这个问题的争论可能会有一个相当长的时间.不管将来的结论如何,但计算机证明(解题) 毕竟代表将来数学问题解决的一个方向.就象安德鲁·怀尔斯(Andrew Wiles) 突发灵感地把“伊娃沙娃理论”和“科利瓦金弗莱切方法”结合在一起可以完美地互相补足,以致最终证明了“费马大定理”一样,未来的数学家或许会让“逻辑证明”和“计算机证明”也完美结合,从而解决更多的数学问题.注;西蒙·辛格[英],1998 年.《费马大定理一个困惑了世间智者358 年的谜》,薛密译,上海译文出版社.四、自己动手1.一道竞赛题(以下称“原问题”)1998 年4 月香港数理教育学会主办的初中数学竞赛有这样一道试题:在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A 与B 的乘积的最大值是多少?解答:最大值是15.你能给出逻辑推理解法并用计算机加以验证吗?由上述问题引伸出的三个问题:2.满足原问题题意的不同的加法算式(竖式)共有多少个?本问题有60 个不同竖式(解).试给出逻辑推理解法并用计算机加以验证.原竞赛题是针对初中生而设计的,故问题的难度被大大降低了.本练习已有一定难度.不可否认,逻辑推理是解决问题的重要途径,而计算机模拟解题在其中所起的作用也是不言而喻的.我们可以将练习 2 一般化,你将发现计算机模拟解题的有效性和重要性.3.如果在原问题中删除条件:“任意两个数字都不相同”,则满足题意的不同的加法算式(竖式)共有多少个?本问题实际上是一个有约束条件的全排列问题.本问题的答案是:48195 个!这真是一个神奇的数值.要得到这个数值应该说是有一定难度的.试给出逻辑推理解法并用计算机加以验证.注:假如在本问题中允许三个“加数”与“和数”均可以由数字0 作为开头,去掉“任意两个数字都不相同”这个条件限制,本问题则变成一个真正的全排列问题.在a + bc + def = ghij中,“和数”ghij 是被动的.由a,b,c,d,e,f {0,1,2,3,4,5,6,7,8,9},此时本问题有解106个.练习 3 是利用计算机模拟解题的真正代表,可以说计算机模拟解题能力在某些方面确已达到了逻辑推理解题的能力.而以下的练习 4 将把练习 2 的难度进一步加大.你将发现运用计算机模拟解题在某些方面甚至已超过运用逻辑推理解题.这个问题是:4.假如违反常规,允许三个“加数”与“和数”均可以由数字0 作为开头,保留条件:“任意两个数字都不相同”,则满足原问题题意的不同的加法算式(竖式)共有多少个?本问题共有228 个解,即在练习2 有60 个不同竖式(解)的基础上再增加 168 个解.试给出逻辑推理解法并用计算机加以验证.分析和观察:练习 4 的结论与本实验中的“问题三”的结论是否有一定的联系? 有何联系?5.验证本实验中的“问题四”、“问题五”的结论.能否给出相应的推理解法?答案是:非常困难! 不妨一试.你是否发现运用计算机模拟解决本问题,已超过运用逻辑推理解决本问题?6.设A ~ J 表示十个互不相同的数字,问:方程(注意: 组成分数的四个数的第一位数字不能为0)IJH DEFG ABC 共有多少个解?答案是110个? 是118个? 是其它的数字?为什么?7.前面所说的“用不同的语言编写出的类似程序,其运行结果居然差距很大”现象,你遇到过吗?试结合附录6,分析产生漏(增)解的原因.8.利用Matlab 文件操作技术修改附录1,使得结果可以保存到一个文本文件中.类似地,用Turbo C 文件操作技术修改附录3,使得结果也可以保存到一个文本文件中.五、附录附录1 (fulu1.m):tic;n=0;for a=1:9for b=1:9if (b==a), continue; endfor c=1:9if (c==a | c==b), continue; endfor d=1:9if (d==a | d==b | d==c), continue; endfor e=1:9if (e==a | e==b | e==c | e==d), continue; endfor f=1:9if (f==a | f==b | f==c | f==d | f==e), continue; endfor g=1:9if (g==a | g==b | g==c | g==d | g==e | g==f), continue; endfor h=1:9if (h==a | h==b | h==c | h==d | h==e | h==f | h==g), continue; endfor i=1:9if (i==a | i==b | i==c | i==d | i==e | i==f | i==g | i==h)continue;endif (a<d & a*(10*e+f)*(10*h+i) +d*(10*b+c)*(10*h+i) == g*(10*b+c)*(10*e+f)) n=n+1;disp(['第',num2str(n),'个解:',...num2str(a),'/',num2str(b),num2str(c),'+',...num2str(d),'/',num2str(e),num2str(f),'=',...num2str(g),'/',num2str(h),num2str(i)])end;end;end;end;end;end;end;end;end;end; %% 共有10个endt3=toc;fprintf('\n The elapsed time(measured by tic/toc) is: %g',t3)附录1B (fulu1B.m):t=cputime;n=0;for a=1:9for b=1:9if b~=afor c=1:9if c~=a & c~=bfor d=1:9if d~=a & d~=b & d~=cfor e=1:9if e~=a & e~=b & e~=c & e~=dfor f=1:9if f~=a & f~=b & f~=c & f~=d & f~=efor g=1:9if g~=a & g~=b & g~=c & g~=d & g~=e & g~=ffor h=1:9if h~=a & h~=b & h~=c & h~=d & h~=e & h~=f & h~=gfor i=1:9if i~=a & i~=b & i~=c & i~=d & i~=e & i~=f & i~=g & i~=h ...& a+b==c & d+e==f & g+h==i*10 & a<b & d<e & a<d & g<hn=n+1;disp(['第', num2str(n), '个解:', ...num2str(a), '+', num2str(b), '=', num2str(c), ' ', ...num2str(d), '+', num2str(e), '=', num2str(f), ' ', ...num2str(g), '+', num2str(h), '=', num2str(i), '0'])end;end;end;end;end;end;end;end;end;end; end;end;end;end;end;end;end%% 共有17个endtime=cputime-t附录2 (fulu2.m,提速版):t02=clock;n=0;A1=1:9;for i1=1:9a=A1(i1); A2=A1([1:i1-1,i1+1:9]);for i2=1:8b=A2(i2); A3=A2([1:i2-1,i2+1:8]);for i3=1:7c=A3(i3); A4=A3([1:i3-1,i3+1:7]);for i4=1:6d=A4(i4); A5=A4([1:i4-1,i4+1:6]);for i5=1:5e=A5(i5); A6=A5([1:i5-1,i5+1:5]);for i6=1:4f=A6(i6); A7=A6([1:i6-1,i6+1:4]);for i7=1:3g=A7(i7); A8=A7([1:i7-1,i7+1:3]);for i8=1:2h=A8(i8); i=A8([1:i8-1,i8+1:2]);if (a<d & a*(10*e+f)*(10*h+i) +d*(10*b+c)*(10*h+i) == g*(10*b+c)*(10*e+f)) n=n+1;disp(['第',num2str(n),'个解:',...num2str(a),'/',num2str(b),num2str(c),'+',...num2str(d),'/',num2str(e),num2str(f),'=',...num2str(g),'/',num2str(h),num2str(i)])endendendendendendendendendt2=etime(clock,t02);fprintf('\n The elapsed time(measured by clock/etime) is: %g',t2)附录3 (Turbo C 程序,fulu3.c):#include<stdio.h>main(){ int a,b,c,d,e,f,g,h,i,j,n=0;printf("\n\n");for (a=1;a<=9;a++){for (b=1;b<=9;b++){if (b==a) continue;for (c=1;c<=9;c++){if (c==a||c==b) continue;for (d=1;d<=9;d++){if (d==a||d==b||d==c) continue;for (e=1;e<=9;e++){if (e==a||e==b||e==c||e==d) continue;for (f=1;f<=9;f++){if (f==a||f==b||f==c||f==d||f==e) continue;for (g=1;g<=9;g++){if (g==a||g==b||g==c||g==d||g==e||g==f) continue;for (h=1;h<=9;h++){if (h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;for (i=1;i<=9;i++){if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;elseif ((a+b==c)&&(d+e==f) &&(g+h==10*i)&&(a<b)&&(d<e)&&(a<d)&&(g<h)){printf ("%3d: %d+%d=%d, %d+%d=%d, %d+%d=%d0 ",++n,a,b,c,d,e,f,g,h,i);if (n%3==0) printf("\n");} } } } } } } } } }}}附录4 (Mathematica 程序,fulu4.nb):Timing[ (*a+b=c, d+e=f, g+h=i0*)Clear[n,a,b,c,d,e,f,g,h,i]; n=0;For[a=1,a<=9,a++,For[b=1,b<=9,b++,If[b!=a,For[c=1,c<=9,c++,If[c!=a&&c!=b,For[d=1,d<=9,d++,If[d!=a&&d!=b&&d!=c,For[e=1,e<=9,e++,If[e!=a&&e!=b&&e!=c&&e!=d,For[f=1,f<=9,f++,If[f!=a&&f!=b&&f!=c&&f!=d&&f!=e,For[g=1,g<=9,g++,If[g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f,For[h=1,h<=9,h++,If[h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g, For[i=1,i<=9,i++,If[i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h &&a+b==c&&d+e==f&&g+h==10*i&&a<b&&d<e&&a<d&&g<h,Print[++n,": ",a,"+",b,"=",c,",",d,"+",e,"=",f,",",g,"+",h,"=",i,"0"]] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] (* total have 17 right ")"s *)]附录5 (Matlab 程序,fulu5.m):程序基本上同附录1,只要将倒数第4 行至倒数第9 行换成下列 5 行即可.if i~=a & i~=b & i~=c & i~=d & i~=e & i~=f & i~=g & i~=h ...& (100*a+10*b+c)+(100*d+10*e+f)==(100*g+10*h+i) & a<dn=n+1;disp(['第', num2str(n), '个解:', ...num2str(100*a+10*b+c), '+', num2str(100*d+10*e+f), '=', num2str(100*g+10*h+i)])附录6 (Matlab 程序,fulu6.m):程序基本上同附录1,只要将倒数第4行至倒数第9 行换成下列 6 行即可.if i~=a & i~=b & i~=c & i~=d & i~=e & i~=f & i~=g & i~=h ...& a/(10*b+c)+d/(10*e+f)==g/(10*h+i) & a<dn=n+1;disp(['第', num2str(n), '个解:', num2str(a), '/' , num2str(b), num2str(c), '+', ...num2str(d), '/' , num2str(e) , num2str(f), '=', num2str(g), '/', num2str(h), …num2str(i)])。

MATLAB常见绘图问题及解决方法

MATLAB常见绘图问题及解决方法

MATLAB常见绘图问题及解决方法一、引言MATLAB作为一种强大的科学计算和数据可视化工具,广泛应用于各个领域。

在进行数据分析和可视化过程中,经常会遇到一些绘图问题。

本文将针对一些常见的绘图问题进行探讨,并提供相应的解决方法,帮助读者更好地使用MATLAB进行数据可视化。

二、数据处理与准备在进行绘图前,首先需要对数据进行处理和准备。

常见的问题包括数据清洗、数据类型转换以及数据筛选与排序等。

在MATLAB中,可以使用各种功能强大的函数来解决这些问题。

例如,可以使用"readtable"函数读取Excel中的数据,并使用"table2array"函数将表格转换为数组。

此外,还可以使用"sort"函数对数据进行排序,或者使用"unique"函数去除重复值。

三、基本绘图函数的使用MATLAB提供了丰富的基本绘图函数,如"plot"、"bar"、"scatter"等,可以根据需求选择适合的函数进行绘图。

然而,在使用这些函数时,也会遇到一些常见的问题。

1. 如何设置坐标轴范围在绘制图形时,经常需要设置坐标轴的范围,以确保所展示的数据能够完整显示。

可以使用"xlim"和"ylim"函数来设置x轴和y轴的范围。

例如,使用"xlim([0,10])"将x轴范围设置为0到10。

2. 如何设置坐标轴标题为了使图形更加清晰明了,可以为坐标轴添加标题。

可以使用"xlabel"和"ylabel"函数来设置x轴和y轴的标题。

例如,可以使用"xlabel('时间(s)')"来为x轴添加标题。

3. 如何添加图例在绘图时,可能同时展示多条曲线或者多个数据集,此时需要添加图例以区分不同的曲线或数据。

数据填充算法 matlab

数据填充算法 matlab

数据填充算法 matlab
数据填充算法是一种用于填充缺失数据的技术,在处理数据时非常常见。

Matlab是一种流行的数学计算软件,也提供了许多数据处理工具。

在本文中,我们将介绍一些常用的数据填充算法,并讨论如何在Matlab中实现它们。

首先,我们介绍最简单的数据填充算法——均值填充。

这种方法在缺失数据的位置用整个数据集的均值填充。

在Matlab中,可以使用mean函数计算均值,并使用isnan函数检查缺失值。

然后,使用for循环将均值填充到缺失位置。

另一种常见的数据填充算法是中值填充。

这种方法使用数据集的中位数来填充缺失位置。

在Matlab中,可以使用median函数计算中位数,并使用isnan函数检查缺失值。

然后,使用for循环将中位数填充到缺失位置。

一种更高级的数据填充算法是KNN填充。

这种方法使用K近邻算法来填充缺失值。

在Matlab中,可以使用fitcknn函数训练KNN模型,并使用predict函数预测缺失位置的值。

最后,我们介绍一种基于矩阵分解的数据填充算法——SVD填充。

这种方法使用奇异值分解(SVD)来分解数据矩阵,并使用分解后的矩阵来填充缺失位置。

在Matlab中,可以使用svd函数进行SVD分解,并使用乘法来填充缺失位置。

总之,在Matlab中实现数据填充算法并不难,只需要使用一些简单的函数和循环即可。

不同的算法具有不同的优缺点,可以根据具
体的数据情况选择合适的算法。

浅析用MATLAB函数实现图像填充的方法

浅析用MATLAB函数实现图像填充的方法
科 技论 坛 I A L B函数实现图像填充的方法
( 吉林 师范大学分院)
摘 要: 从有可视 的模拟 图像开始, 自 图像 的简化就 已经被 用来加速绘制图像。纹理 映射 已经提供 了一种将 图像分解为 独立的 、 小的像素块来 显示的方法。主要说明通过 以上思想的逻 辑方法、 通过填充的方式来实现绘制三维坐标 图像 , 实现 图像的填 充。 关键词 : 填充 ; 图像重绘 ; 叠; 重 漏洞 M TA A L B是—个计算核心 , 是当今国际上科 每个特定的像素在相机移动的过程中在屏幕上的 2 重叠像素的处理。 1 重叠产生的 一种原因是 学界最具影响力、 也是最有活力的软件。 它起源于 ‘移动轨迹。 偏移向量被储存在填充表中, 填充表被 图像内的像素块在移动 中 靠拢 , 因而产生图像的 矩阵运算, 已经发展成一种高度集成的计算机 用来访问并决定每个像素的移动。这个表格的映 相对压缩, 并 导致重叠。 这样的典型例子就是当视角 语言。 它为用户提供了许多强大的功能 , A L B 射关系是多对一 的关系 , M TA 因为在源图像中很多像 由垂直的变为倾斜的时候 , 透视算法在视角变换 语言在各国 高校与研究单位起着重大的作用。 素的移动方式是一样的 , 因此偏移矩阵可以是一 的时候会导致图像的 压缩。 M TA A L B语言的很重要的一个应用方面就 个稀疏矩阵。 图表是有方向性的, 根据源图与 目 标 不同 深度的像素的移动同样会导致重叠。解 是用来处理与图像相关的问题。 于 M T A 是 图的关系确定方 向。 由 AL B 决像素的重叠问题就是解决表面的可见问题 。解 基于矩阵处理的语言 , 因此在处理图像矩阵时具 在传统的图像填充中人工确定的源图和 目 标 决这种问题的—个方法就是利用 z 缓冲区算法来 有很 多丰富 的给定 函数 。利用 M T A A L B本 身 图之间的联系经常被用来填充二维图像的重绘 , 决定像素的可见性。一种更加高效的方法是最近 T o oe 中的丰富的函数资源 , ol xs b 可以轻松的对图 我们算法的 特点主要是联系是密集的, 并且图像 的像素处在最合适的地方。因此在填充的过程中 像进行很多的逻辑 ,色彩变换,像素矩阵大小变 的变换矩阵 , 像素的偏移向量是明确的 、 预先储存 先移动大的块会得到更好的效果 ,虽然在图像与 换, 图像的变形等处理。 好的, 这样中间图 像的生成就会十分快速。 现实的近似程度上要有一定的失真;但是可以减 本文 的算 法使用 M T A A L B制作 ,A L B M TA 本算法使用的是与图像同样大小的矩阵储存 少很多系统资源 的消耗。 具有十分强大的图像处理功能, 本身 自 带的强大 x Y方向的偏移 , , 移动像素块的时候直接查找对 2 移动中产生的漏洞及避免。 - 2 在源图像中像 的图像处理函数可以方便地实现多种图像的填充 应位置的x Y偏移。 , 素块移动的时候很容易产生各种的像素漏洞。当 合成。 1 按联系填充。生成两幅图像之间 的图像 , . 2 个方块形状的像素块由源图像向目的图像移动 1图像填充的主要过程 偏移向量是线性的,因此源图像中的 像素是沿着 的过程中,只要按着像素方块的四角移动就可以 图像的重绘即同 时填充形状和纹理。此过程 线性的轨迹向其在目 标图像中的位置移动的。 到达移动所需要的位置,然后填充像素方块中的 主要有两个步骤。 第一步 , 创建两幅图像之间的联 这种填充过程是通过透视矩阵进行的近似的 像素的值可以在~定程度上避免产生像素漏洞 ; 系, 这也是最为困难的一步。 这种联系通常是由人 像素坐标的移动。这种算法得出的效果与透视变 所以在移动的时候后移动大的像素方块可以在一 工建立的。例如使用者可以定义两幅图像中的一 换描绘出的图像 的圆滑度和缩放比例相同。透视 定程度 E 避免产生漏洞。 系列的点或者线的片断之间的联系, 然后调用一 移动算法需要将像素的坐标与—个 44 x 的移动矩 个更加高效率的解决方法是将漏洞中的像 个算法来生成图像其他部分的联系。第二步就是 阵相乘 , 还要通过坐标的相似性进行分割。 虽然分 素填充它邻近像素 的值以补偿漏洞 , 但是这种方 利用已经生成的联系来填充每幅已知图像的中间 割的界限是由图像决定而不是由真实场景的复杂 法获得的图像与真实值的近似程度要更差一些 。 画面 , 也就是按照联系中的对应的偏移向量来搬 度决定 , 但是这种分割算法是十分好用系统资源 要通过使用附近像素的值来填充漏洞必须先定义 移已 知图像中的像素生成需要的中间图像。 的。线性的像素坐标填充使用的是储存了偏移向 个背景颜色 , 也就是图像填充的时候作为背景 可以利用相机的移动和已知图像的本身的具 量的图表, 这样在填充的过程中是十分高效 的。 的矩阵应该被初始化为一定的特殊颜色。但是漏 体数据来 自 动地生成图像问的联系。这种联系描 如果视角的改变是十分微小的, 那么填充所 洞是不会改变背景颜色的 , 然后可以根据漏洞 中 述了源图像和最终图像 间的像素一一对应关 系。 得到的图像与精确算法得到的图像将十分接近。 像素周围像素的值来填充漏洞中的像素。不断使 基本的算法是像素按着已经生成的联系图中的对 二次的或者立体的填充虽然会好用更多的系统资 用不同的背景颜色就可 以 将全部的像素漏洞都找 应 的偏移向量 移动到相应的位 置来生成填充画 源 , 但却难以 得到更加精确的 结果。 当相机的移动 到。 面。 由于是像素本身的移动来生成填充画面, 因此 沿平行的直线的时候 , 线性的填充得到的结果是 最简单的处理方法。先设定填充图像的矩阵 需要使用 z 缓冲区来决定像素的可见性 , 并以此 十分精确的。 由于相机的移动是沿直线的, 因此屏 的背景数值, 也就是将矩阵初始化为某个颜色的 来决定移动的次序。在填充的过程中可能会出现 幕上的像素点是沿直线移动。 以填充获得的方 矩阵。 所 遍历整个生成图像的矩阵, 一旦发现像素的 各种因为像素搬移出现的漏洞,需要特定的算法 形物体 的效果与透视算法获得的效果是相同的。 值与预先设定的背景像素值相同则将此像素点的 来补偿这些漏洞 , 使其与周围像素的色彩—致 。 在窗口中的像素方块内的全部像素在相机平行移 值赋值为l l 匠 的非背景像素值的像素的数值 , 从 本算法是十分高效的,因为利用了两个有效 动 的时候是按 相同 的偏移 向量移动 的 。根据 而将漏洞补偿。 的措施加速了 填充过程的速度。 第一 , 由于相邻的 q at e ud e 算法压缩成的像素方块来找到源图像 中 r 本算法是一种快速的生成相近视点的预存图 像素具有十分相近甚至相同的移动方式 ,因此 对应的的像素块 ; 然后根据像素块在源图像中的 像中间图像的方法 , 能很好地节省系统资源 , 填充 根据偏移量移 是通过预先运算联系图实现的, Q aTe 算法压缩 出的像素块 可以近似地移动 坐标查找偏移矩阵中的 偏移量。 udr e 效率很高 。 可以被 方式相同的像素分块,主要的像素块可以 在移动 动像素方块 。 填充到预先初始化好背景的矩阵中, 用来填充据有相机位置 、 、 视角 观察方向、 分等级 的过程中作为整体移动。 第二 , 这些像素块又按其 生成图像 。 边缘像素块和底部像素块的处理要有 物体的移动等大量不同参数的图像。 参考 文献 Z坐标的J 储存, l 按照 Z坐标的先后顺序移动解 特别方法。边缘像素块在移动的时候可能出现移 出显示区域的问题 ,因此要对这样 的像素块作裁 【S ee agEi hn ac la : i n 决了可见性的问题 。 1 h nhn r C e , neWii Ve I— ] c L l ms w e p lto o ma e S n h ss 1 建立像素之间的联系。当相机运动的时 剪处理。 . 1 底部像素块由于不是正方形的, 因此在遍 t r o a i n f r I g y t e i. 候.相机的可视区域内的物体 向 相反的方向移动 历的时候要特别对待。每幅中间画面都要用有背 【 张智星.A L B程序设计与应用 M 北京: 2 】 M TA 【l 清华 时,每个物体的移动的 速度是 由 此物体与相机的 景色的图像矩阵来生成 , 这样做的主要目的是为 大学 出版

matlab数学实验考试题及答案

matlab数学实验考试题及答案

matlab数学实验考试题及答案一、选择题(每题2分,共10分)1. MATLAB中用于生成0到1之间均匀分布的随机数的函数是?A. randB. randiC. randnD. randperm答案:A2. 下列哪个命令可以计算矩阵的行列式?A. detB. rankC. eigD. inv答案:A3. MATLAB中用于求解线性方程组的命令是?A. solveB. linsolveC. fsolveD. ode45答案:A4. 在MATLAB中,如何创建一个3x3的单位矩阵?A. eye(3)B. ones(3)C. zeros(3)D. identity(3)答案:A5. MATLAB中用于绘制二维图形的函数是?A. plotB. surfC. meshD. contour答案:A二、填空题(每题3分,共15分)1. MATLAB中,使用________函数可以计算矩阵的迹。

答案:trace2. 若要在MATLAB中创建一个从1到10的向量,可以使用________函数。

答案:1:103. MATLAB中,使用________函数可以计算矩阵的特征值。

答案:eig4. 若要在MATLAB中绘制一个正弦波,可以使用________函数。

答案:sin5. MATLAB中,使用________函数可以计算矩阵的逆。

答案:inv三、简答题(每题10分,共20分)1. 描述MATLAB中如何使用循环结构来计算并打印1到100之间所有奇数的和。

答案:可以使用for循环结构,初始化一个变量sum为0,然后遍历1到100之间的每个数,使用模运算符判断是否为奇数,如果是,则将其加到sum上,最后打印sum的值。

2. 简述MATLAB中如何使用条件语句来检查一个数是否为素数,并打印出所有小于100的素数。

答案:可以使用for循环遍历2到99之间的每个数,对于每个数,使用一个while循环检查它是否有除1和它本身之外的因数,如果没有,则使用if语句判断该数是否为素数,如果是,则打印该数。

MATLAB全部实验及答案

MATLAB全部实验及答案

MATLAB全部实验及答案MATLAB全部实验及答案实验一、MATLAB基本操作实验内容及步骤4、有关向量、矩阵或数组的一些运算(1)设A=15;B=20;求C=A+B与c=a+b?(2)设A=[1 2 3;4 5 6;7 8 9],B=[9 8 7;6 5 4;3 2 1];求A*B 与A.*B?A*B就是线代里面的矩阵相乘A.*B是对应位置的元素相乘(3)设a=10,b=20;求i=a/b=0.5与j=a\b=2?(4)设a=[1 -2 3;4 5 -4;5 -6 7]请设计出程序,分别找出小于0的矩阵元素及其位置(单下标、全下标的形式),并将其单下标转换成全下标。

clear,clca=[1 -2 3;4 5 -4;5 -6 7];[x,y]=find(a<0);c=[];for i=1:length(x)c(i,1)=a(x(i),y(i));c(i,2)=x(i);c(i,3)=y(i);c(i,4)=(y(i)-1)*size(a,2)+x(i);endc(5)在MATLAB命令行窗口运行A=[1,2;3,4]+i*[5,6;7,8];看结果如何?如果改成运行A=[1,2;3,4]+i[5,6;7,8],结果又如何?前面那个是虚数矩阵,后面那个出错(6)请写出完成下列计算的指令:a=[1 2 3;3 4 2;5 2 3],求a^2=?,a.^2=?a^2= 22 16 1625 26 2326 24 28a.^2=1 4 99 16 425 4 9(7)有一段指令如下,请思考并说明运行结果及其原因clearX=[1 2;8 9;3 6];X( : ) 转化为列向量(8)使用三元组方法,创建下列稀疏矩阵2 0 8 00 0 0 10 4 0 06 0 0 0方法一:clear,clcdata=[2 8 1 4 6];ir=[1 1 2 3 4 ];jc=[1 3 4 2 1];s=sparse(ir,jc,data,4,4);full(s)方法二:不用三元组法clear,clca=zeros(4,4);a(1,[1,3])=[2,8];a(2,4)=1;a(3,2)=4;a(4,1)=6;a(9)写出下列指令的运行结果>> A = [ 1 2 3 ]; B = [ 4 5 6 ];>> C = 3.^A>> D = A.^B5、已知+?=-334sin 234πt e y t 若需要计算t ∈[-1,1],取间隔为0.01,试计算出相对应的y 值。

实验4答案Matlab程序设计1

实验4答案Matlab程序设计1

实验4答案Matlab程序设计1实验4 Matlab 程序设计1实验目的:1、掌握建立和执行M 文件的方法;2、掌握实现选择结构的方法;3、掌握实现循环结构的方法。

实验内容:1. 从键盘输入一个4位整数,按如下规则加密后输出。

加密规则:每位数字都加上7,然后用和除以10的余数取代该数字;再把第一位与第三位交换,第二位与第四位交换。

a = input('请输入一个四位整数:');a1 = fix(a/1000);a2 = rem(fix(a/100),10);a3 = rem(rem(fix(a/10),100),10);a4 = rem(a,10);a1 = rem(a1+7,10)a2 = rem(a2+7,10)a3 = rem(a3+7,10)a4 = rem(a4+7,10)b1 = a1;a1 = a3;a3 = b1;b2 = a2;a2 = a4;a4 = b2;b = a1*1000+a2*100+a3*10+a42. 求分段函数的值。

,x x x x y x x x x x x x ?+- <≠-?=-+ ≤<≠≠??-- ?2226035605231且且及其他用if 语句实现,分别输出x=-5,-3,0,1,2,2.5,3,5时的y 值。

x = input(请输入X 的值:');if x <0 & x~=-3y = x.*x +x-6;elseif x>=0 & x<5 & x~=2 & x~=3y = x.*x-5*x+6;elsey = x.*x-x-1;endy3.输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中90~100分为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。

要求:(1)分别用if语句和swich语句实现。

(2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。

matlab实训报告

matlab实训报告

数学软件应用实训实训报告学生姓名韩建学号1309064046 班级信计1302班成绩指导教师数学与计算机科学学院2015年 12 月 15 日实训报告评阅1特殊函数与图形问题背景与实验目的著名的Riemann函数大家都很熟悉了,但是关于它的图像你是否清楚呢?除了最上面那几点,其他都很难画吧?你想不想看看下面那些“挤在一起”的点是怎样分布的呢?还有几何中的马鞍面、单叶双曲面等是怎样由直线生成的,是不是也想目睹一下呢?这些,都离不开绘图.实际上绘图一直是数学中的一种重要手段,借助图形,往往可以化繁为简,使抽象的对象得到明白直观的体现.比如函数的基本性质,一个图形常可以使之一目了然,非常有效.它虽不能代替严格的分析与证明,但在问题的研究过程中,可以帮助研究人员节约相当一部分精力.此外,它还可以使计算、证明、建模等的结果得到更明白易懂的表现,有时,这比科学论证更有说服力.同时,数学的教学与学习过程也离不开绘图.借助直观的图形,常可以使初学者更容易接受新知识.如数学分析中有不少函数,其解析式着实让人望而生畏,即使对其性质作了详尽的分析,还是感到难明就里;但如果能看到它的图形,再配合理论分析,则问题可以迎刃而解.又如在几何的学习中,会遇到大量的曲线与曲面,也离不开图形的配合.传统的手工作图,往往费力耗时,效果也不尽理想.计算机恰恰弥补了这个不足,使你可以方便地指定各种视角、比例、明暗,从各个角度进行观察.本实验通过对函数的图形表示和几个曲面(线)图形的介绍,一方面展示它们的特点,另一方面,也将就Matlab软件的作图功能作一个简单介绍.大家将会看到,Matlab 的作图功能非常强大.实验内容数学分析中,特别是积分部分,我们接触了不少有趣的函数,由于其中有的不是一一对应的,用上面的方法无法画出它们的图像,这时就只能用参数了.此外还有些图形只能用参数来画,比如空间曲线,在计算机上不接受“两个曲面的交线”这种表示,所以也只能用参数来实现.用参数方式作图的关键在于找出合适的参数表示,尤其是不能有奇点,最好也不要用到开方.所以要找的参数最好是有几何意义的.当然这也不可一概而论,需要多积累经验.实验步骤1.做出下图所示的三维图形:图9ezsurf('3*sin(u)*cos(v)','3*sin(u)*sin(v)','3*cos(u)',[0,pi,0,2*pi]);axis equalhold onezsurf('(8+2*cos(u))*cos(v)','(8+2*cos(u))*sin(v)','2*sin(u)',[0,2*pi,0,2*pi]) 2作出下图所示的墨西哥帽子及其剪裁图形:[a,b]=meshgrid(-5:.5:5);c=sqrt(a.^2+b.^2)+eps;z=sin(c)./c;mesh(a,b,z)axis square改变a、b的取值范围,可得到裁剪后的图。

matlab数字图像处理图像运算+答案

matlab数字图像处理图像运算+答案

matlab数字图像处理图像运算+答案实验⼆:图像运算⼀、实验⽬的掌握MATLAB语⾔中图像数据的读取、显⽰与保存⽅法;掌握统计图像灰度直⽅图的⽅法理解直⽅图均衡的原理和作⽤,掌握图像直⽅图均衡化的⽅法理解图像点运算、代数运算、⼏何运算的基本定义和常见⽅法进⼀步熟悉了解MATLAB语⾔的应⽤⼆、知识要点1.数据类型及图像类型间的基本转换函数数据类转换:B = data_class_name(A);2.imhist(H);%显⽰a的直⽅图histeq(H); %将图像a进⾏直⽅图均衡化adapthisteq(H); %将图像a进⾏直⽅图均衡化3.图像的点运算点运算是通过对图像中每个像素值进⾏计算,改善图像显⽰效果的操作,也称对⽐度增强或对⽐度拉伸或灰度变换。

可以表⽰为B(x,y)=f(A(x,y)).进⾏逐点运算,输⼊映射为输出,不改变图像像素的空间关系。

Y=aX+b %线性点运算Y=X+aX(max(X)-X) %⾮线性点运算4.代数运算代数运算是指对两幅输⼊图像进⾏点对点的加、减、乘或除运算⽽得到输出图像的运算。

四种图像代数运算的数学表达式如下:C(i,j)=A(i,j)+B(i,j) C=imadd(A,B)C(i,j)=A(i,j)-B(i,j) C=imsubtract(A,B);C(i,j)=A(i,j)*B(i,j) C=immultiply(A,B)C(i,j)=A(i,j)/B(i,j) C=imdivide(A,B)5.图像加噪函数imnoise(参阅matlab help)imnoise的语法格式为J = imnoise(I,type)J = imnoise(I,type,parameters)其中J=imnoise(I,type)返回对原始图像I添加典型噪声的有噪图像J。

参数type 和parameters⽤于确定噪声的类型和相应的参数。

J = imnoise(I,'gaussian',m,v) %加⼊均值m,⽅差为v的⾼斯噪声,m默认值0,v默认值0.01J = imnoise(I,'poisson') %加⼊泊松分布的噪声J = imnoise(I,'salt & pepper',d)%加⼊密度为d的椒盐噪声,d的默认值为0.05 J = imnoise(I,'speckle',v) %加⼊均值0,⽅差为v的乘性噪声三、实验内容1、将给定的Couple.bmp图像⽂件读出并显⽰,显⽰其灰度直⽅图,分别⽤histeq、adapthiateq函数将其直⽅图均衡化,观察均衡后的图像及其直⽅图。

实验四 MATLAB的图形操作(答案)

实验四   MATLAB的图形操作(答案)

MATLAB实验报告专业班级电气1042姓名唐松学号18成绩评定电气与信息学院和谐勤奋求是创新实验教学考核和成绩评定办法1.课内实验考核成绩,严格按照该课程教学大纲中明确规定的比重执行。

实验成绩不合格者,不能参加课程考试,待补做合格后方能参加考试。

2.单独设立的实验课考核按百分制评分,考核内容应包括基本理论、实验原理和实验。

3.实验考核内容包括:1)实验预习;2)实验过程(包括实验操作、实验记录和实验态度、表现);3)实验报告;权重分别为0.2 、0.4 、0.4;原则上根据上述三个方面进行综合评定。

学生未取得1)和2)项成绩时,第3)项成绩无效。

4.实验指导教师应严格按照考核内容分项给出评定成绩,并及时批改实验报告,给出综合成绩,反馈实验中出现的问题。

实验成绩在教师手册中有记载。

实验报告主要内容一.实验目的二.实验仪器及设备三.实验原理四.实验步骤五.实验记录及原始记录六.数据处理及结论七. 思考题八.实验体会(可选项)注:1. 为了节省纸张,保护环境,便于保管实验报告,统一采用A4纸,实验报告建议双面打印(正文采用宋体五号字)或手写,右侧装订。

2. 实验类别指验证、演示、综合、设计、创新(研究)、操作六种类型实验。

3. 验证性实验:是指为了使学生巩固课程基本理论知识而开设的强调演示和证明,注重实验结果(事实、概念或理论)的实验。

4. 综合性实验:是指实验内容涉及本课程的综合知识或本课程相关的课程知识的实验。

5. 设计性实验:是指给定实验目的、要求和实验条件,由学生自行设计实验方案并加以实现的实验。

>>(2) 绘制函数y=sin2tcos2t的极坐标图形。

>> t=0:.01:2*pi;(3) 设置绘图线的线型、颜色、宽度、标记点的颜色及大小。

>> t=0:.01:2*pi;特殊图形(1)条形图绘制指定坐标x=[1 2 3 4 5];>>(2)饼图x= [10 25 37 66 88],绘制饼图,并将第五个切块分离出来。

数学建模实验报告数字填图问题

数学建模实验报告数字填图问题

数字填图问题一、实验目的及意义本实验旨在通过生活中几个常见的数字填图问题的探究,探究这类问题的逻辑推理解法和计算机解法.二、实验内容1. 数字填图的逻辑推理;2. 数字填图的计算机解法。

三、实验步骤1.开启软件平台——MA TLAB,开启MATLAB,编辑窗口根据计算算法步骤编写M文件2.保存文件并运行;3.观察运行结果(数值或图形);4.根据观察到的结果和体会写出实验报告。

四、实验要求与任务根据实验内容和步骤,完成以下实验,要求写出实验报告。

1.一道竞赛题(以下称“原问题”)1998 年4 月香港数理教育学会主办的初中数学竞赛有这样一道试题:在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A 与B 的乘积的最大值是多少? 请给出逻辑推理解法并用计算机加以验证.2.用MATLAB编程验证本实验中的“问题四”、“问题五”的结论.wilyes11收集博客(与学习无关):/u/1810231802五. 程序代码及运行结果(经调试后正确的源程序)1.一道竞赛题(以下称“原问题”)1998 年4 月香港数理教育学会主办的初中数学竞赛有这样一道试题:在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A 与B 的乘积的最大值是多少? 请给出逻辑推理解法并用计算机加以验证.逻辑推理:按题意,本题运算一共包含0到9这10个数字。

每个□表示一个数字,任意两个数字都不相同。

按从上到下,从左到右的顺序,□依次用字母C、(D、E)、(F、G、H)、(I、J、A、B)表示。

可以得到以下几个条件:1.0不能作为“加数”与“和数”的首位,即C、D、F、I不能取0;2.百位取9,两个十位分别取8、7,三个个位分别取6、5、4,不考虑与“和数”数字重复,可得到最大的“和数”为1065。

因I不能取0,故可知I=1,J=0;3.A、B、C、D、E、F、G、H分别取2到9这8个数字,同时要满足加法竖式,如何取值的具体推理不作详解。

MATLAB课后试验答案

MATLAB课后试验答案
2、clear all
x=input('请输入成绩:'); while (x>100|x<0)
x=input('输入错误,请重新输入成绩:'); end
switch fix(x/10)
case {9,10}
disp('A') case {8}
disp('B') case {7}
disp('C') case {6}
if x<0&x~=-3 y1=x~2+x—6;
disp(['y=',num2str(y1)]) elseif x>=0&x<5&x~=2&x~=3
y2=x"2-5*x+6;
disp(['y= ',num2str(y2)]) else
y3=x~2—x—1;
disp(['y= ',num2str(y3)]) end end
y1=linspace(0,10,31);
[x,y]:meshgrid(x1,y1);
z=cos(x).*cos(y).*exp(-0.25.*sqrt(x「2+y—2))
subplot(2,1,1);
surf(x,y,z);
subplot(2,1,2);
contour3(x,y,z,30);
6、clear all
c=c+7;
d=d+7;
e=e+7;
b=rem(b,10);
c=rem(c,10);
d=rem(c,10);
e=rem(e,10);
g=b;b=d;d=g;

MATLAB数字图像实验报告

MATLAB数字图像实验报告

基于MATLAB的图像处理的课程设计物理与信息工程学院一、课程设计的目的综合运用MATLAB工具箱实现图像处理的GUI程序设计。

二、课程设计的基本要求1)熟悉和掌握MA TLAB 程序设计方法2)掌握MATLAB GUI 程序设计3)学习和熟悉MA TLAB图像处理工具箱4)学会运用MATLAB工具箱对图像进行处理和分析三、程序需求和功能模块分析设计分为6个部分,分别为文件,实现图像读取、保存和退出该演示的功能;图像转换,实现RGB转为灰度图像、索引图像,二进制图像和创建轮廓等功能;工具,实现亮度改变、锐化、剪切、旋转和直方图统计与均衡等功能;缩放,实现最近邻插值法和双线性插值法的放大和缩小;噪声与滤波,实现对图像添加各种噪声和对图像进行去噪处理;帮助,是一个关于MA TLAB的显示。

四、详细设计过程,详细阐述如何实现具体操作,必要时画出流程图分析,附上关键程序代码。

学习MATLAB GUI程序设计,利用MA TLAB图像处理工具箱,设计和实现自己的Photoshop 。

要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。

然后按照自己拟定的功能要求进行程序设计和调试。

具体操作双击打开MATLAB 7.0→File→New→GUI→修改名称→保存;单击→调整文本框的大小,输入该演示名称,修改字体大小、颜色等;单击→调整axes1大小→单击OK,调整按钮大小和颜色,再建axes2→单击OK,调整按钮大小和颜色;单击→调整噪声群文本框的大小,输入名称,修改字体大小、颜色等,单击,建立3个噪声框;单击建立滤波群框,单击,建立3个滤波框;单击,建立Menu Editor,即建目录;View→M-file Edit→编写程序;最后单击,建立几个便捷按钮,相应的View callbacks与之前同。

程序代码及实现的功能1)图像的读取和保存。

读取[name,path]=uigetfile('*.*','');file=[path,name];axes(handles.axes1);x=imread(file);handles.img=x;guidata(hObject, handles);imshow(x);title(‘打开’);保存[sFileName sFilePath]=uiputfile({'*.jpg','JPEG-Files (*.jpg)'; ...'*.*','All Files (*.*)'},'保存图像文件','untitled.jpg');if ~isequal([sFileName,sFilePath],[0,0])sFileFullName=[sFilePath sFileName];imwrite(handles.noise_img,sFileFullName,'jpg');elsemsgbox('确定取消保存?');end退出clc;close all;close(gcf);2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。

4 MatLab练习题-绘图完成

4 MatLab练习题-绘图完成

数学建模课程实验报告专题实验1班级学号姓名实验题目专题一MatLab 练习题-绘图与matlab程序设计实验目的初步了解数学建模基本概念、方法和步骤。

实验内容(包括分析过程、方法、和代码,结果)MatLab 练习题-绘图1,在[0,4pi]画sin(x),cos(x)(在同一个图象中); 其中cos(x)图象用红色小圆圈画.并在函数图上标注“y=sin(x)”, “y=cos(x)” ,x轴,y轴,标题为“正弦余弦函数图象”.程序:space(0,4*pi,40);plot(x,cos(x),'or',x,sin(x))xlabel('x'), ylabel('y');title('正弦余弦函数')gtext('y=sinx'),gtext('y=cosx')2468101214-1-0.8-0.6-0.4-0.200.20.40.60.81xy正弦余弦函数y=sinxy=cosx答案:2, 画>> a = [0:pi/50:2*pi]';X = cos(a)*4;Y = sin(a)*2; plot(X,Y);xlabel('x'), ylabel('y'); title('椭圆')>>出椭圆221169x y +=。

-4-3-2-101234-2-1.5-1-0.500.511.52xy答案:3,绘制螺旋线. (12cos )(12sin )3x u y u z u =+⎧⎪=+⎨⎪=⎩[0,10]u ∈>> u=0:0.5:10;plot3(1+2*cos(u),1+2*sin(u),u) xlabel('x'), ylabel('y'); title('螺旋线')-1123-11230246810xy答案:4,绘制四叶玫瑰线sin 2ρθ=。

MATLAB数学实验答案(全)

MATLAB数学实验答案(全)

第一次练习教学要求:熟练掌握Matlab 软件的基本命令和操作,会作二维、三维几何图形,能够用Matlab 软件解决微积分、线性代数与解析几何中的计算问题。

补充命令vpa(x,n) 显示x 的n 位有效数字,教材102页fplot(‘f(x)’,[a,b]) 函数作图命令,画出f(x)在区间[a,b]上的图形 在下面的题目中m 为你的学号的后3位(1-9班)或4位(10班以上) 1.1 计算30sin limx mx mx x →-与3sin limx mx mxx →∞- syms xlimit((902*x-sin(902*x))/x^3) ans =366935404/3limit((902*x-sin(902*x))/x^3,inf)//inf 的意思 ans = 0 1.2 cos1000xmxy e =,求''y syms xdiff(exp(x)*cos(902*x/1000),2)//diff 及其后的2的意思 ans =(46599*cos((451*x)/500)*exp(x))/250000 - (451*sin((451*x)/500)*exp(x))/250 1.3 计算2211x y edxdy +⎰⎰dblquad(@(x,y) exp(x.^2+y.^2),0,1,0,1)//双重积分 ans = 2.13941.4 计算4224x dx m x +⎰ syms xint(x^4/(902^2+4*x^2))//不定积分 ans =(91733851*atan(x/451))/4 - (203401*x)/4 + x^3/12 1.5 (10)cos ,x y e mx y =求//高阶导数syms xdiff(exp(x)*cos(902*x),10) ans =-356485076957717053044344387763*cos(902*x)*exp(x)-3952323024277642494822005884*sin(902*x)*exp(x)1.6 0x =的泰勒展式(最高次幂为4).syms xtaylor(sqrt(902/1000+x),5,x)//泰勒展式 ans =-(9765625*451^(1/2)*500^(1/2)*x^4)/82743933602 +(15625*451^(1/2)*500^(1/2)*x^3)/91733851-(125*451^(1/2)*500^(1/2)*x^2)/406802 + (451^(1/2)*500^(1/2)*x)/902 +(451^(1/2)*500^(1/2))/500 1.7 Fibonacci 数列{}n x 的定义是121,1x x ==12,(3,4,)n n n x x x n --=+=用循环语句编程给出该数列的前20项(要求将结果用向量的形式给出)。

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

实验四数字填图问题一、问题背景和实验目的数字填图问题是数学问题的一种趣味形式.早在19世纪后半期,一些数学家就在报刊中大量使用数字填图游戏和字谜游戏等,目的是使业余爱好者也能通过简单的形式去认识、理解和琢磨深奥的数学问题,这些问题中甚至包括困惑了世间智者350多年、于1994年才刚刚被证明了的“费马大定理”.100多年来,数字填图问题对数学界所起的作用是不言而喻的.大家都知道,数学问题一般都经过严格的逻辑证明才得以解决.而逻辑证明是指从一些公理出发,经过逻辑推理来证明问题.但随着20世纪40年代以来计算机的诞生和发展,计算机改变了整个世界,计算机已在各个领域发挥作用,并取得了许多重大进展.于是,能否用计算机来证明数学问题便成了大家关心的话题.所谓计算机证明是指充分发挥计算机计算速度快和会“推理”的特点,用计算机程序模拟解题或进行穷举检验,最后得到问题的解.几乎所有的数学家对计算机证明持保留态度,因为他们相信,只有逻辑证明才是真正可靠的.但“四色问题”的证明,又使他们感到困惑,因为“四色问题”的证明实际上是一个计算机证明.能否用计算机来证明数学问题的争论可能会持续一个相当长的时间,本实验旨在通过生活中几个常见的数字填图问题的探究,谈谈这类问题的逻辑推理解法和计算机解法.二、相关函数(命令)简介1.cputime命令:记录执行本命令时的Matlab时钟的时间(秒).2.tic命令:开始计时.3.toc命令:结束计时.4.disp(x):输出矩阵x.x的各项应为字符,所以在输出时要进行转化.相关的命令有:num2str():把数值转化为字符;mat2str():把矩阵转化为字符.5.fopen(filename,mode):用mode方式打开/建立filename文件,以备写入数据,使用方式:fid=fopen(filename,mode).6.fclose(fid):关闭上述文件.例如下列程序是把一个两行的矩阵y写入文件output.dat:x=0:0.1:1;y=[x;exp(x)];fid=fopen(’output.dat’,’wt’);fprintf(fid,’x exp(x)\n’);fprintf(fid,’%6.2f%12.8f\n’,y);%实际得到的是矩阵y的转置矩阵status=fclose(fid);与C语言的文件操作方式相类似.三、实验内容让我们先从一个简单的问题出发来谈谈数字填图问题的两种解法.然后通过几个稍复杂问题的探究,从中展示逻辑推理的严谨以及计算机解法的魅力,启迪我们去解决更复杂的数学问题.注:在本实验中,将表达式abc 理解为,即100*a +10*b +c ,其余类似,不另加说明.(一)、一个简单的问题及其解答问题一:在图1的几个加法等式中,每个□表示一个非零数字,任意两个数字都不相同,问有多少个解?图1【逻辑解法】为简洁起见,将它的3个式子记作:a +b =c ,d +e =f ,g +h =i 0,若问题有解,则显然有i =1,且(a +b )+(d +e )+(g +h )=c +f +i ⨯10,故45=(a +b +c )+(d +e +f )+(g +h +i )=2(c +f )+i ⨯11,即c +f =17,故c =8,f =9或c =9,f =8.考虑到a ~i 互不相同,当要求a <b ,d <e ,g <h 时,有如下4组解(见下表):注:本问题实际上仅有2个解是本质的,即表中的第2、3行,第4、5行所代表的解仅是位置不同而已.如不要求a <b ,d <e ,g <h ,则解的个数是1212124C C C 个.【计算机解法】为验证此结果,可用Mathematica 、Matlab 、Turbo C 等软件进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题解的情况恰如上所述.用Matlab 实现的程序清单可参见附录1,这一算法比较慢(一个更慢的算法参见附录1B ,试分析其原因),而一个提速的程序清单可参见附录2,Turbo C 程序清单可参见附录3,而Mathematica 程序清单可参见附录4.【评论】这个问题的逻辑解法十分简单,或许根本不需要计算机解法,但所用程序有一定的代表性,稍加修改即可解决一系列问题,这点可从下面的问题中看到.(二)、几个较复杂的问题及其解答问题二:在图2的4个算式中,每个□表示一个非零数字,任意两个数字都不相同,问(A )、(B )、(C )和(D )这4种情形分别有多少个解?图2讨论:显然,情形(C)无解.情形(D)与情形(C)实际上是同一个问题,因此也无解.情形(B)与情形(A)实际上也是同一个问题.我们先讨论情形(A)的解的个数.【逻辑解法】为简洁起见,将此竖式记作:abc+def=ghi,即,其中a~i代表1~9这9个互不相同的非零数字.据九余数性质可知,两个“加数”中的六个数字之和被9除的余数应等于“和数”中的三个数字之和被9除的余数.又这两个“加数”与“和数”中共九个数字正好是1,2,⋅⋅⋅,9,它们的和为45,被9除的余数是0,易见“和数”的三个数字之和被9除的余数必为0,也即:“和数”是9的倍数.注意到题设可知,“和数”的三个数字之和必定为:g+h+i=9或g+h+i=18.<1>考虑g+h+i=9的情形.(1)首先必定有g>3,否则{a,d}最小为{1,2},{b,e}最小为{4,5},{c,f}最小为{6,7},此时已有abc+def>400,与g≤3矛盾.故g≥4;另外,g≤6为显然;(2)若g=4,由g+h+i=9,h+i=5,故{h,i}最小为{1,4}或{2,3};但已有g=4,故{h,i}为{2,3},而{a,d}最小为{1,4},从而g≥5,与g=4矛盾;(3)若g=5,由g+h+i=9,h+i=4,故{h,i}为{1,3};而{a,d}最小为{2,4},从而g≥6,与g=5矛盾;(4)若g=6,由g+h+i=9,h+i=3,故{h,i}为{1,2};而{a,d}最小为{3,4},从而g≥7,与g=6矛盾.综上所述,g+h+i=9的情形下问题无解.<2>考虑g+h+i=18的情形.由于g≥4(理由同上),以下按g=9,8,⋯,4的顺序分类讨论:(1)g=9,则h+i=9.由于a~i互不相同,于是g,h,i的可能的取值见下表:对这些竖式有序地交换两个加数的百位数、十位数和个位数,可得到每个类型的8(=121212C C C )个不同竖式(解),小计有解12⨯8=96个.注意:表中的第2、5、6、9列为容易造成失解的地方,要特别留意.完全类似地有如下一系列过程:(2)g =8,则h +i =10.仿(1),小计有解10⨯8=80个,解例见下表:(3)g =7,则h +i =11.小计有解5⨯8=40个,解例见下表:(4)g =6,则h +i =12.小计有解6⨯8=48个,解例见下表:(5)g =5,则h +i =13.小计有解5⨯8=40个,解例见下表:(6)g =4,则h +i =14.小计有解4⨯8=32个,解例见下表:结论:本问题的解的个数为:(12+10+5+6+5+4)⨯8=42⨯8=336.注:<1>如不考虑两个加数的上下位置关系,则总的解的个数为:42⨯8/2= 168.<2>由于情形(B)与情形(A)是同一个问题,故解的个数也为:42⨯8 =336.【计算机解法】为验证此结果,仍用Matlab、Mathematica、Turbo C编程进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题有且只有336个不同竖式(解),而Matlab程序清单可参见附录5,你可发现它与附录1十分相似.【评论】这个问题的逻辑解法较复杂,而计算机解法则是如此的简单快捷,运行整个程序不要1分钟.实际上非常复杂的“四色问题”的证明也是这样:对1482种有代表性地图的分析,若依靠人工去做,可能要几十年甚至上百年的时间,而用计算机,只要1200小时即告完成.这还是70年计算机的计算水平,若用现在的计算机,计算时间应该不会超过一天!问题三:在图3的加法算式中,每个□表示一个非零数字,任意两个数字都不相同,问可有多少个解?【逻辑解法】为简洁起见,将此竖式记作:a+bc+def=ghi或,其中a~i代表1~9这9个互不相同的非零数字.据九余数性质并采用完全类似问题二的讨论可知,“和数”的三个数字之和必定为:g+h+i=9或g+h+i=18.同时,g≠1,否则d=1;另外g>d,从而g=d+1.由于9≥g≥2,以下按g=9,8,7,⋅⋅⋅,2的顺序分类讨论:(0)g=9,d=8.则h+i=9.由于a~i互不相同,于是g,h,i的可能的取值为(见下表):图3小计有解0个.(1)g=8,d=7.则h+i=1(不可能,舍去)或h+i=10.由于a~i互不相同,于是g,h,i的可能的取值为(见下表):对这些竖式有序地交换三个加数的个位数、两个加数的十位数,可得到每个类型的12个不同竖式(解),小计有解2⨯12=24个.完全类似地有如下一系列过程:(2)g=7,d=6.则h+i=2(不可能,舍去)或h+i=11.仿(1),小计有解2⨯12=24个.(3)g=6,d=5.则h+i=3或h+i=12.有解1⨯12=12个,解例见下表:(4)g=5,d=4.则h+i=4或h+i=13.有解3⨯12=36个,解例见下表:(5)g=4,d=3.则h+i=5或h+i=14.有解2⨯12=24个,解例见下表:(6)g =3,d =2.则h +i =6或h +i =15.有解2⨯12=24个,解例见下表:(7)g =2,d =1.则h +i =7或h +i =16.有解2⨯12=24个,解例见下表:结论:本问题的解的个数为:(2+2+1+3+2+2+2)⨯12=168.【计算机解法】让我们再尝试计算机解法.仍用Matlab 、Mathematica 、Turbo C 编程进行穷举法验证,程序清单类似于附录1~附录5,不再另附.运行结果表明本问题的确有且只有168个不同竖式(解),要说明的是:该程序在一般的计算机上运行一次也只需不到1分钟.【评论】也许有人会说,你的问题还仅是一个有穷的问题,象“费马大定理”这样的无穷问题,你的计算机就无能为力了!情况或许是这样.但应该注意到:非常复杂的“四色问题”也是一个无穷问题,但妙就妙在有人能将它们缩小到1482种有代表性地图以内,从而成为一个有穷的问题!至此,对于计算机解题的作用恐怕再不能视而不见了!下面的两个问题也是成功地运用计算机解题的的一些典型例子,而至少到目前为止还没有看到它们的推理解法.问题四:图4的加法等式是:两个真分数之和等于第三个真分数,每个□表示一个不为0的数字,任意两个数字都不相同.比如:847965321=+,试找出所有可能的解.图4【计算机解法】本问题利用计算机程序已找到解答,共有10个解.解答请参见:《数学教学》(华东师范大学)1994年第5期.【评论】程序如何编?看起来问题似乎很简单,只要将附录1~附录5稍加修改即可.例如可利用附录6的Matlab 程序进行计算.但实际情况让我们大吃一惊:用Matlab程序居然只有6个解!还有4个解到哪里去了?用Turbo C程序编写出的类似的程序居然只有7(或9)个解!还有3(或1)个解到哪里去了?还有人用Turbo C程序编写出的类似的程序,却居然得到了11个“解”!这个多出的1个“解”是哪里来的?类似的问题还会发生在本实验的“四、自己动手”的第6题中,用不同的语言编写出的类似程序,其运行结果居然差距很大,你能明白其中的道理吗?根据观察,可能是浮点问题,也可能是整数的上界问题,或别的什么原因.具体什么原因,留作思考题.问题五:图5的加法等式是:两个假分数之和等于第三个假分数,每个□表示一个不为0的数字,任意两个数字都不相同.试找出所有可能的解.图5【计算机解法】本问题利用计算机程序也已找到解答,共有41个解.同样只要将附录1~5的程序稍加修改即可.(三)、小结数字填图问题是一种活泼的、变形的数学问题,逻辑推理是这类问题的一般解法.但也有若干数字填图问题要找到这样的逻辑推理解法是非常地困难,而采用计算机解法则轻而易举.问题一和问题二就是这样的例子.至于问题四和问题五则只能给出计算机解法.尽管数学家们很难接受计算机解法,因为他们担心计算机会出错(尽管这种出错的概率几乎为零!),更重要的是他们坚信逻辑证明是解答这类问题的根本方法.但上述事实证明计算机解法也是十分有效的.另一个公认的例子是“四色问题”,它的证明实际上就是一个计算机证明.关于这个问题的争论可能会有一个相当长的时间.不管将来的结论如何,但计算机证明(解题)毕竟代表将来数学问题解决的一个方向.就象安德鲁·怀尔斯(Andrew Wiles)突发灵感地把“伊娃沙娃理论”和“科利瓦金弗莱切方法”结合在一起可以完美地互相补足,以致最终证明了“费马大定理”一样,未来的数学家或许会让“逻辑证明”和“计算机证明”也完美结合,从而解决更多的数学问题.注;西蒙·辛格[英],1998年.《费马大定理一个困惑了世间智者358年的谜》,薛密译,上海译文出版社.四、自己动手1.一道竞赛题(以下称“原问题”)1998年4月香港数理教育学会主办的初中数学竞赛有这样一道试题:在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A与B的乘积的最大值是多少?解答:最大值是15.你能给出逻辑推理解法并用计算机加以验证吗?由上述问题引伸出的三个问题:2.满足原问题题意的不同的加法算式(竖式)共有多少个?本问题有60个不同竖式(解).试给出逻辑推理解法并用计算机加以验证.原竞赛题是针对初中生而设计的,故问题的难度被大大降低了.本练习已有一定难度.不可否认,逻辑推理是解决问题的重要途径,而计算机模拟解题在其中所起的作用也是不言而喻的.我们可以将练习2一般化,你将发现计算机模拟解题的有效性和重要性.3.如果在原问题中删除条件:“任意两个数字都不相同”,则满足题意的不同的加法算式(竖式)共有多少个?本问题实际上是一个有约束条件的全排列问题.本问题的答案是:48195个!这真是一个神奇的数值.要得到这个数值应该说是有一定难度的.试给出逻辑推理解法并用计算机加以验证.注:假如在本问题中允许三个“加数”与“和数”均可以由数字0作为开头,去掉“任意两个数字都不相同”这个条件限制,本问题则变成一个真正的全排列问题.在a +bc +def =ghij 中,“和数”ghij 是被动的.由a ,b ,c ,d ,e ,f ∈{0,1,2,3,4,5,6,7,8,9},此时本问题有解106个.练习3是利用计算机模拟解题的真正代表,可以说计算机模拟解题能力在某些方面确已达到了逻辑推理解题的能力.而以下的练习4将把练习2的难度进一步加大.你将发现运用计算机模拟解题在某些方面甚至已超过运用逻辑推理解题.这个问题是:4.假如违反常规,允许三个“加数”与“和数”均可以由数字0作为开头,保留条件:“任意两个数字都不相同”,则满足原问题题意的不同的加法算式(竖式)共有多少个?本问题共有228个解,即在练习2有60个不同竖式(解)的基础上再增加168个解.试给出逻辑推理解法并用计算机加以验证.分析和观察:练习4的结论与本实验中的“问题三”的结论是否有一定的联系?有何联系?5.验证本实验中的“问题四”、“问题五”的结论.能否给出相应的推理解法?答案是:非常困难!不妨一试.你是否发现运用计算机模拟解决本问题,已超过运用逻辑推理解决本问题?6.设A ~J 表示十个互不相同的数字,问:方程(注意:组成分数的四个数的第一位数字不能为0)IJH DEFG ABC =共有多少个解?答案是110个?是118个?是其它的数字?为什么?7.前面所说的“用不同的语言编写出的类似程序,其运行结果居然差距很大”现象,你遇到过吗?试结合附录6,分析产生漏(增)解的原因.8.利用Matlab 文件操作技术修改附录1,使得结果可以保存到一个文本文件中.类似地,用Turbo C 文件操作技术修改附录3,使得结果也可以保存到一个文本文件中.五、附录附录1(fulu1.m):tic;n=0;for a=1:9for b=1:9if(b==a),continue;endfor c=1:9if(c==a|c==b),continue;endfor d=1:9if(d==a|d==b|d==c),continue;endfor e=1:9if(e==a|e==b|e==c|e==d),continue;endfor f=1:9if(f==a|f==b|f==c|f==d|f==e),continue;endfor g=1:9if(g==a|g==b|g==c|g==d|g==e|g==f),continue;endfor h=1:9if(h==a|h==b|h==c|h==d|h==e|h==f|h==g),continue;endfor i=1:9if(i==a|i==b|i==c|i==d|i==e|i==f|i==g|i==h)continue;endif(a<d&a*(10*e+f)*(10*h+i)+d*(10*b+c)*(10*h+i)==g*(10*b+c)*(10*e+f)) n=n+1;disp(['第',num2str(n),'个解:',...num2str(a),'/',num2str(b),num2str(c),'+',...num2str(d),'/',num2str(e),num2str(f),'=',...num2str(g),'/',num2str(h),num2str(i)])end;end;end;end;end;end;end;end;end;end;%%共有10个endt3=toc;fprintf('\n The elapsed time(measured by tic/toc)is:%g',t3)附录1B(fulu1B.m):t=cputime;n=0;for a=1:9for b=1:9if b~=afor c=1:9if c~=a&c~=bfor d=1:9if d~=a&d~=b&d~=cfor e=1:9if e~=a&e~=b&e~=c&e~=dfor f=1:9if f~=a&f~=b&f~=c&f~=d&f~=efor g=1:9if g~=a&g~=b&g~=c&g~=d&g~=e&g~=ffor h=1:9if h~=a&h~=b&h~=c&h~=d&h~=e&h~=f&h~=gfor i=1:9if i~=a&i~=b&i~=c&i~=d&i~=e&i~=f&i~=g&i~=h...&a+b==c&d+e==f&g+h==i*10&a<b&d<e&a<d&g<hn=n+1;disp(['第',num2str(n),'个解:',...num2str(a),'+',num2str(b),'=',num2str(c),'',...num2str(d),'+',num2str(e),'=',num2str(f),'',...num2str(g),'+',num2str(h),'=',num2str(i),'0'])end;end;end;end;end;end;end;end;end;end;end;end;end;end;end;end;end%%共有17个endtime=cputime-t附录2(fulu2.m,提速版):t02=clock;n=0;A1=1:9;for i1=1:9a=A1(i1);A2=A1([1:i1-1,i1+1:9]);for i2=1:8b=A2(i2);A3=A2([1:i2-1,i2+1:8]);for i3=1:7c=A3(i3);A4=A3([1:i3-1,i3+1:7]);for i4=1:6d=A4(i4);A5=A4([1:i4-1,i4+1:6]);for i5=1:5e=A5(i5);A6=A5([1:i5-1,i5+1:5]);for i6=1:4f=A6(i6);A7=A6([1:i6-1,i6+1:4]);for i7=1:3g=A7(i7);A8=A7([1:i7-1,i7+1:3]);for i8=1:2h=A8(i8);i=A8([1:i8-1,i8+1:2]);if(a<d&a*(10*e+f)*(10*h+i)+d*(10*b+c)*(10*h+i)==g*(10*b+c)*(10*e+f)) n=n+1;disp(['第',num2str(n),'个解:',...num2str(a),'/',num2str(b),num2str(c),'+',...num2str(d),'/',num2str(e),num2str(f),'=',...num2str(g),'/',num2str(h),num2str(i)])endendendendendendendendendt2=etime(clock,t02);fprintf('\n The elapsed time(measured by clock/etime)is:%g',t2)附录3(Turbo C程序,fulu3.c):#include<stdio.h>main(){int a,b,c,d,e,f,g,h,i,j,n=0;printf("\n\n");for(a=1;a<=9;a++){for(b=1;b<=9;b++){if(b==a)continue;for(c=1;c<=9;c++){if(c==a||c==b)continue;for(d=1;d<=9;d++){if(d==a||d==b||d==c)continue;for(e=1;e<=9;e++){if(e==a||e==b||e==c||e==d)continue;for(f=1;f<=9;f++){if(f==a||f==b||f==c||f==d||f==e)continue;for(g=1;g<=9;g++){if(g==a||g==b||g==c||g==d||g==e||g==f)continue;for(h=1;h<=9;h++){if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;for(i=1;i<=9;i++){if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;elseif((a+b==c)&&(d+e==f)&&(g+h==10*i)&&(a<b)&&(d<e)&&(a<d)&&(g<h)){printf("%3d:%d+%d=%d,%d+%d=%d,%d+%d=%d0",++n,a,b,c,d,e,f,g,h,i);if(n%3==0)printf("\n");}}}}}}}}}}}}附录4(Mathematica程序,fulu4.nb):Timing[(*a+b=c,d+e=f,g+h=i0*)Clear[n,a,b,c,d,e,f,g,h,i];n=0;For[a=1,a<=9,a++,For[b=1,b<=9,b++,If[b!=a,For[c=1,c<=9,c++,If[c!=a&&c!=b,For[d=1,d<=9,d++,If[d!=a&&d!=b&&d!=c,For[e=1,e<=9,e++,If[e!=a&&e!=b&&e!=c&&e!=d,For[f=1,f<=9,f++,If[f!=a&&f!=b&&f!=c&&f!=d&&f!=e,For[g=1,g<=9,g++,If[g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f,For[h=1,h<=9,h++,If[h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g, For[i=1,i<=9,i++,If[i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h &&a+b==c&&d+e==f&&g+h==10*i&&a<b&&d<e&&a<d&&g<h,Print[++n,":",a,"+",b,"=",c,",",d,"+",e,"=",f,",",g,"+",h,"=",i,"0"]]]]]]]]]]]]]]]]]](*total have17right")"s*)]附录5(Matlab程序,fulu5.m):程序基本上同附录1,只要将倒数第4行至倒数第9行换成下列5行即可.if i~=a&i~=b&i~=c&i~=d&i~=e&i~=f&i~=g&i~=h...&(100*a+10*b+c)+(100*d+10*e+f)==(100*g+10*h+i)&a<dn=n+1;disp(['第',num2str(n),'个解:',...num2str(100*a+10*b+c),'+',num2str(100*d+10*e+f),'=',num2str(100*g+10*h+i)])附录6(Matlab程序,fulu6.m):程序基本上同附录1,只要将倒数第4行至倒数第9行换成下列6行即可.if i~=a&i~=b&i~=c&i~=d&i~=e&i~=f&i~=g&i~=h...&a/(10*b+c)+d/(10*e+f)==g/(10*h+i)&a<dn=n+1;disp(['第',num2str(n),'个解:',num2str(a),'/',num2str(b),num2str(c),'+',...num2str(d),'/',num2str(e),num2str(f),'=',num2str(g),'/',num2str(h),…num2str(i)])。

相关文档
最新文档