各种数值算法1

合集下载

数值分析与算法_1

数值分析与算法_1

作业1第4题:程序如下:k=[1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20]; n=10.^k;e1=1+1./n;e2=(e1).^n;er=e2-exp(1)x=1:20;plot(x,er)运行结果为:当k=1,2,3,…,20时,近似值的误差分别为:er =-0.124539368359043-0.013467999037517-0.001357896223452-0.000135901634120-0.000013591266748-0.000001359363292-0.000000134326964-0.0000000301116880.0000002235525150.0000002247757420.0000002248980650.000241667578192-0.002171794372145-0.0021717943720230.316753378090216-1.718281828459046-1.718281828459046-1.718281828459046-1.718281828459046-1.718281828459046误差的变化趋势曲线为:从图中可以看出,随n的增加,误差越来越低,趋于0,但由于matlab处理数据有一定的范围,所以最后六个数据误差很大。

第5题:(1)判停标准:若对于x,n趋于无穷大时,用无穷级数计算出的即为准确结果,但由于matlab处理的是有限的数值,所以应在x<0时即判停;(2)测试程序如下:syms x ky=1+symsum(x^k/gamma(k+1),k,1,inf)f=inline(y)y1=f(1);y2=f(-1);y3=f(5);y4=f(-5);y5=f(10);y6=f(-10);y7=f(15);y8=f(-15);y9=f(20);y10=f(-20); %.....................测试程序......................% s=1+symsum(x^k/gamma(k+1),k,1,100);f1=inline(s);s1=f1(1);s2=f1(-1);s3=f1(5);s4=f1(-5);s5=f1(10);s6=f1(-10);s7=f1(15);s8=f1(-15);s9=f1(20);s10=f1(-20);er1=s1-y1er2=s2-y2er3=s3-y3er4=s4-y4er5=s5-y5er6=s6-y6er7=s7-y7er8=s8-y8er9=s9-y9er10=s10-y10在有限值范围内k值取100,得到的计算结果的误差为:er1 =-4.440892098500626e-016er2 =er3 =2.842170943040401e-014er4 =-2.544839339257976e-015er5 =3.637978807091713e-012er6 =-3.004204551142545e-013er7 =4.656612873077393e-010er8 =8.041428902172784e-012er9 =er10 =1.254237543025391e-008(3)当x<0时,不能用此程序得到准确的结果。

数据挖掘十大算法

数据挖掘十大算法

数据挖掘十大算法数据挖掘是通过挖掘大规模数据集以发现隐藏的模式和关联性的过程。

在数据挖掘领域,存在许多算法用于解决各种问题。

以下是数据挖掘领域中被广泛使用的十大算法:1. 决策树(Decision Trees):决策树是一种用于分类和回归的非参数算法。

它用树结构来表示决策规则,通过划分数据集并根据不同的属性值进行分类。

2. 支持向量机(Support Vector Machines,SVM):SVM是一种二分类算法,通过在数据空间中找到一个最优的超平面来分类数据。

SVM在处理非线性问题时,可以使用核函数将数据映射到高维空间。

3. 朴素贝叶斯(Naive Bayes):基于贝叶斯定理,朴素贝叶斯算法使用特征之间的独立性假设,通过计算给定特征下的类别概率,进行分类。

4. K均值聚类(K-means Clustering):K均值聚类是一种无监督学习算法,用于将数据集分割成多个类别。

该算法通过计算样本之间的距离,并将相似的样本聚类在一起。

5. 线性回归(Linear Regression):线性回归是一种用于建立连续数值预测模型的算法。

它通过拟合线性函数来寻找自变量和因变量之间的关系。

6. 关联规则(Association Rules):关联规则用于发现数据集中项集之间的关联性。

例如,购买了商品A的人也常常购买商品B。

7. 神经网络(Neural Networks):神经网络是一种模拟人脑神经元网络的算法。

它通过训练多个神经元之间的连接权重,来学习输入和输出之间的关系。

9. 改进的Apriori算法:Apriori算法用于发现大规模数据集中的频繁项集。

改进的Apriori算法通过剪枝和利用频繁项集的性质来提高算法的效率。

10. 集成学习(Ensemble Learning):集成学习是一种通过将多个学习器进行组合,从而提高分类准确率的算法。

常用的集成学习方法包括随机森林和梯度提升树。

这些算法在不同的场景和问题中有着不同的应用。

数值计算1-5章

数值计算1-5章

数值计算1-5章数值计算⽅法第1章绪论1.1数值计算⽅法的研究对象和特点数值计算⽅法也称数值分析,它研究⽤计算机求解各种数学问题的数值⽅法及其理论。

数学学科内容⼗分⼴泛,数值计算⽅法属于计算数学的范畴,这⾥只涉及科学和⼯程计算中常见的数学问题,如函数的插值、逼近、离散数据的拟合、数值积分与数值微分、线性和⾮线性⽅程数值解法和矩阵特征值问题数值解法和微分⽅程数值解法等.由于计算机科学与技术的迅速发展,数值计算⽅法的应⽤已经普遍深⼊到各个科学领域,很多复杂和⼤规模的计算问题都可以在计算机上进⾏计算,新的、有效的数值⽅法不断出现.现在,科学与⼯程中的数值计算已经成为各门⾃然科学和⼯程技术科学研究的⼀种重要⼿段,成为与实验和理论并列的⼀个不可缺少的环节.所以,数值计算⽅法既是⼀个基础性的,同时也是⼀个应⽤性的数学学科分⽀,与其他学科的联系⼗分紧密.⽤数值⽅法求解数学问题⾸先要构造算法,即由运算规则(包括算术运算、逻辑运算和运算顺序)构成的完整的解题过程.同⼀个数学问题可能有多种数值计算⽅法,但不⼀定都有效.评价⼀个算法的好坏主要有两条标准:计算结果的精度和得到结果所付出的代价.我们⾃然应该选择代价⼩⼜能满⾜精度要求的算法.计算代价也称为计算复杂性,包括时间复杂性和空间复杂性.时间复杂性好是指节省时间,主要由运算次数决定.空间复杂性好是指节省存储量,主要由使⽤的数据量决定.⽤计算机求数学问题的数值解不是简单地构造算法,它涉及多⽅⾯的理论问题,例如,算法的收敛性和稳定性等.除理论分析外,⼀个数值⽅法是否有效,最终要通过⼤量的数值实验来检验.数值计算⽅法具有理论性、实⽤性和实践性都很强的特点.作为数值计算⽅法的基础知识,本课程不可能⾯⾯俱到.除构造算法外,各章根据内容⾃⾝的特点,讨论的问题有所侧重.学习时我们⾸先要注意掌握⽅法的基本原理和思想,要注意⽅法处理的技巧及其与计算机的结合,要重视误差分析、收敛性和稳定性的基本理论.其次,要通过例⼦,学习使⽤各种数值⽅法解决实际计算问题,熟悉数值⽅法的计算过程.最后,为了掌握本课程的内容,还应做⼀定数量的理论分析与计算练习.1.2数值计算的误差1.2.1误差的来源应⽤数学⼯具解决实际问题,⾸先,要对被描述的实际问题进⾏抽象、简化,得到实际问题的数学模型.数学模型与实际问题之间会出现的误差,我们称之为模型误差.在数学模型中,通常要包含⼀些由观测数据确定的参数.数学模型中⼀些参数观测结果⼀般不是绝对准确的.我们把观测模型参数值产⽣的误差称为观测误差.例如,设⼀根铝棒在温度t时的实际长度为Lt,在t=0时的实际长度为L0,⽤lt来表⽰铝棒在温度为t时的长度计算值,并建⽴⼀个数学模型l t =L(1+at), a≈0.0000238/℃,其中a是由实验观测得到的常数,a∈[0.0000237,0.0000239],则称Lt -lt为模型误差,a-0.0000238是a 的观测误差.在解实际问题时,数学模型往往很复杂,因⽽不易获得分析解,这就需要建⽴⼀套⾏之有效的近似⽅法和数值⽅法.我们可能⽤容易计算的问题代替不易计算的问题⽽产⽣误差,也可能⽤有限的过程代替⽆限的过程⽽产⽣误差.我们将模型的准确解与⽤数值⽅法求得的准确解之间的误差称为截断误差或⽅法误差.例如,对函数()()35721sin 13!5!7!21!n x x x xn x x n +=-+-+++-+,该式右边有⽆限多项,计算机上⽆法计算.然⽽,根据微积分学中的泰勒(Taylor )定理,当|x |较⼩时,我们若⽤前3项作为sin x 的近似值,则截断误差的绝对值不超过77!x .⽤计算机做数值计算时,⼀般也不能获得数值计算公式的准确解,需要对原始数据、中间结果和最终结果取有限位数字.我们将计算过程中取有限位数字进⾏运算⽽引起的误差称为舍⼊误差.例如,13=0.33333…,如果我们取⼩数点后4位数字,则13-0.3333=0.000033…就是舍⼊误差.在数值分析中,除了研究数学问题的算法外,还要研究计算结果的误差是否满⾜精度要求,这就是误差估计问题.在数值计算⽅法中,主要讨论的是截断误差和舍⼊误差.1.2.2 误差与有效数字定义1.1 设x 是某实数的精确值,A x 是它的⼀个近似值,则称x -A x 为近似值A x 的绝对误差,或简称误差.Ax x x-称为x A 的相对误差.当x =0时,相对误差没有意义.在实际计算中,精确值x 往往是不知道的,所以通常把AAx x x -作为A x 的相对误差.定义1.2 设x 是某实值的精确值,A x 是它的⼀个近似值,并可对A x 的绝对误差作估计|x -A x |?A ε,则称εA 是A x 的绝对误差界,或简称误差界.称AAx ε是A x 的相对误差界.例 1.1 我们知道π=3.1415926…,若取近似值πA =3.14,则π-πA =0.0015926…,可以估计绝对误差界为0.002,相对误差界为0.0006.例 1.2 测量⼀⽊板长是954 cm,问测量的相对误差界是多⼤?解因为实际问题中所截取的近似数,其绝对误差界⼀般不超过最⼩刻度的半个单位,所以当x =954 cm 时,有A ε=0.5 cm ,其相对误差界为0.50.00052410.053%954AAx ε==< .定义1.3 设A x 是x 的⼀个近似值,将A x 写成12100.,k A i x a a a =±? , (1.1) 它可以是有限或⽆限⼩数的形式,其中i a (i =1,2,…)是0,1,…,9中的⼀个数字,1a ≠0,k 为整数.如果|x -A x |?0.5×10k n -,则称A x 为x 的具有n 位有效数字的近似值.可见,若近似值A x 的误差界是某⼀位的半个单位,该位到A x 的第⼀位⾮零数字共有n 位,则A x 有n 位有效数字.通常在x 的准确值已知的情况下,若要取有限位数的数字作为近似值,就采⽤四舍五⼊的原则,不难验证,采⽤四舍五⼊得到的近似值,其绝对误差界可以取为被保留的最后数位上的半个单位.例如|π-3.14|?0.5×210-, |π-3.142|?0.5×310-.按定义,3.14和3.142分别是具有3位和4位有效数字的近似值.显然,近似值的有效数字位数越多,相对误差界就越⼩,反之也对.下⾯,我们给出相对误差界与有效数字的关系.定理1.1 设x 的近似值A x 有(1.1)式的表达式. (1) 如果A x 有n 位有效数字,则 111×102A nAx x x a --≤; (1.2)(2) 如果()111×1021A nAx x x a --≤+, (1.3)则A x ⾄少具有n 位有效数字.证由(1.1)式可得到()111--?+≤≤?k A k a x a . (1.4)所以,当A x 有n 位有效数字时11110.5101×10,×102k nA nk Ax x x a a ----?≤=即(1.2)式得证.由(1.3)式和(1.4)式有()()nk nk AAA A a a x x x x x x ---?=?+?+≤-=-105.0101211011111,即说明A x 有n 位有效数字,(2)得证.例1.30.1%,应取⼏位有效数字?解由于因此1a =4,设有n 位有效数字,则由(1.2)式,可令11110a -?≤,即410n -?18,得n ?4.故只要对4位有效数字,其相对误差就可⼩于0.1%,4.472.例1.4 已知近似数A x 的相对误差界为0.3%,问A x ⾄少有⼏位有效数字?解设A x 有n 位有效数字,由于A x 的第⼀个有效数1a 没有具体给定,⽽我们知道1a ⼀定是1,2,…,9中的⼀个,由于()12311101000210291A Ax x x --≤<=+,故由(1.3)式知n=2,即A x ⾄少有2位有效数字.1.2.3 函数求值的误差估计对⼀元函数f(x ),⾃变量x 的⼀个近似值为A x ,以f(A x )近似f(x ),其误差界记作ε(f(A x )).若f(x )具有⼆阶连续导数,f′(A x )与f″(A x )的⽐值不太⼤,则可忽略|x -A x |的⼆次项,由Taylor 展开式得到f(A x )的⼀个近似误差界ε(f(A x ))≈|f′(A x )|ε(A x ).对n 元函数f(x 1,x 2,…,x n ),⾃变量x 1,x 2,…,x n 的近似值分别为x 1A ,x 2A ,…,x n A ,则有()()()12121,,,,,,nn A A nA k kA k k Af f x x x f x x x x x x=??-≈- ∑ ,其中()12,,,A A nA k k f f x x x x x A.因此,可以得到函数值的⼀个近似误差界()()()121,,,nAA nA kA k k Af f x x x x x εε=??≈ ∑. 特别地,对f(x 1,x 2)=x 1±x 2有ε(x 1A ±x 2A )=ε(x 1A )+ε(x 2A ).同样,可以得到ε(x 1A x 2A )≈|x 1A |ε(x 2A )+|x 2A |ε(x 1A ),()()12211222A A A A A A A x x x x x x x εεε+??≈,20A x ≠例1.5 设有长为l,宽为d 的某场地.现测得l 的近似值l A =120 m,d 的近似值d A =90 m ,并已知它们的误差界为|l-l A |?0.2 m,|d-d A |?0.2 m.试估计该场地⾯积S=ld 的误差界和相对误差界.解这⾥ε(l A )=0.2,ε(d A )=0.2,并且有2,,10800A A A S S d l S l d mld====.于是有误差界()21200.2900.242A S m ε≈?+?=,相对误差界()()420.39%10800A r A AS S l dεε=≈=.例1.6 设有3个近似数a=2.31, b=1.93, c=2.24,它们都有3位有效数字.试计算p=a+bc 的误差界和相对误差界,并问p 的计算结果能有⼏位有效数字?解 p=2.31+1.93×2.24=6.6332.于是有误差界ε(p)=ε(a)+ε(bc)≈ε(a)+|b|ε(c)+|c|ε(b) =0.005+0.005(1.93+2.24)=0.02585,相对误差界εr (p)=()0.025856.6332p pε≈≈0.39%.因为ε(p)≈0.02585<0.05,所以p=6.6332能有2位有效数字.1.2.4 计算机中数的表⽰任意⼀个⾮零实数⽤(1.1)式表⽰,是规格化的⼗进制科学记数⽅法.在计算机中通常采⽤⼆进制的数系(或其变形的⼗六进制等),并且表⽰成与⼗进制类似的规格化形式,即浮点形式±2m ×0.β1β2…βt ,这⾥整数m 称为阶码,⽤⼆进制表⽰为m=±α1α2…αs , αj =0或1(j=1,2,…,s),s 是阶的位数.⼩数0.β1β2…βt 称为尾数,其中β1=1,βj =0或1(j=2,3,…,t),t 是尾数部位的位数.s 和t 与具体的机器有关.由于计算机的字长总是有限位的,所以计算机所能表⽰的数系是⼀个特殊的离散集合,此集合的数称为机器数.⽤浮点⽅式表⽰的数有⽐较⼤的取值范围.⼗进制输⼊计算机时转换成⼆进制,并对t 位后⾯的数作舍⼊处理,使得尾数为t 位,因此⼀般都有舍⼊误差.两个⼆进制数作算术运算时,对计算结果也要作类似的舍⼊处理,使得尾数为t 位,从⽽也有舍⼊误差.在实现算法时,计算的最后结果与算法的精确解之间的误差,从根本上说是由机器的舍⼊误差造成的,包括输⼊数据和算术运算的舍⼊误差.因此有必要对计算机中数的浮点表⽰⽅法和舍⼊误差有⼀个初步的了解.有时为了分析某⼀个计算⽅法可能出现的误差现象,为了适应⼈们的习惯,我们会采⽤⼗进制实数系统进⾏误差分析.1.3 数值稳定性和要注意的若⼲原则 1.3.1 数值⽅法的稳定性实际计算时,给定的数据会有误差,数值计算中也会产⽣误差,并且,这些误差在进⼀步的计算中会有误差传播.因此,尽管数值计算中的误差估计⽐较困难,我们还是应该重视计算过程中的误差分析.定义 1.4 对于某个数值计算⽅法,如果输⼊数据的误差在计算过程中迅速增长⽽得不到控制,则称该算法是数值不稳定的,否则是数值稳定的.下⾯举例说明误差传播的现象.例 1.7 计算积分值105nxdx I x =+?, n=0,1,…,6.解由于要计算系列的积分值,我们先推导In 的⼀个递推公式.由1110555n n n n x x I I dx x --++=+?111n xdx n-==,可得下⾯两个递推算法.算法1:115n n I I n-=-,n=1,2, (6)算法2:1115n n I I n -??=-,n=6,5, (1)直接计算可得0ln 6ln 5I =-.如果我们⽤4位数字计算,得I 0的近似值为0I *=0.1823.记n n n E I I *=-,I n *为In 的近似值.对算法1,有15n n E E -=-=…=()5n-E 0.按以上初始值I0的取法有|E 0|?0.5×410-,事实上|E 0|≈0.22×410-.这样,我们得到|E 6|=65|E 0|≈0.34.这个数已经⼤⼤超过了I 6的⼤⼩,所以6I *连⼀位有效数字也没有了,误差掩盖了真值.对算法2,有E k-n =15n ??-E k ,|E 0|=615??|E 6|.如果我们能够给出I 6的⼀个近似值,则可由算法2计算I n (n=5,4,…,0)的近似值.并且,即使E 6较⼤,得到的近似值的误差将较⼩.由于()()11011616551kkk xxI d d x x k k =<<=++??,因此,可取Ik 的⼀个近似值为()()11126151k I k k *=+?? ? ?++??. 对k=6有6I *=0.0262.按0I *=0.1823和6I *=0.0262,分别按算法1和算法2计算,计算结果如表1-1,其中()1n I 为算法1的计算值, ()2n I 为算法2的计算值.易知,对于任何⾃然数n,都有0表1-1n()1nI()2nInI (4位)0 0.1823 0.1823 0.18231 0.0885 0.0884 0.08842 0.0575 0.0580 0.05803 0.0458 0.0431 0.04314 0.0210 0.0344 0.03435 0.0950 0.0281 0.02856-0.3083 0.0262 0.0243当然,数值不稳定的⽅法⼀般在实际计算中不能采⽤.数值不稳定的现象属于误差危害现象.下⾯讨论误差危害现象的其他表现及如何避免问题.1.3.2 避免有效数字的损失在数值计算中,参加运算的数有时数量级相差很⼤,⽽计算机位数有限,如不注意,“⼩数”的作⽤可能消失,即出现“⼤数”吃“⼩数”的现象. 例1.8 ⽤3位⼗进制数字计算x =101+δ1+δ2+…+δ100,其中0.1?δi ?0.4,i =1,2, (100)解在计算机内计算时,要写成浮点数形式,且要对阶.如果是101与δ1相加,对阶时,101=0.101×103,δ1=0.000×103.因此,如果我们⾃左⾄右逐个相加,则所有的δi 都会被舍掉,得x ≈101.但若把所有的δi 先加起来,再与101相加,就有111=101+100×0.1?x ?101+100×0.4=141.可见,计算的次序会产⽣很⼤的影响.这是因为⽤计算机计算时,在运算中要“对阶”,对阶引起了⼤数吃⼩数的现象.⼤数吃⼩数在有些情况下是允许的,但有些情况下则会造成谬误.在数值计算中,两个相近数相减会使有效数字严重损失.例1.9 求实系数⼆次⽅程20ax bx c ++=的根,其中b 2-4ac>0,ab ≠0. 解考虑两种算法. 算法1:1,22x a=算法2:(12b sign b x a--=, 21c x ax =,其中sign 表⽰取数的符号,即()1,0,0,0,1,0.b sign b b b >??==??-对算法1,若ac b 42>>,则是不稳定的,否则是稳定的.这是因为在算法1中分⼦会有相近数相减的情形,会造成有效数字的严重损失,从⽽结果的误差很⼤.算法2不存在这个问题,在任何情况下都是稳定的.因此称算法1是条件稳定的,算法2是⽆条件稳定的.例如,对于⽅程262.10 1.0000x x ++=,⽤4位有效数字计算,结果如下:算法1:x 1=-62.08, x 2=-0.02000. 算法2:x 1=-62.08, x 2=-0.01611.准确解是x 1=-62.083892…,x 2=-0.016107237….这⾥,ac b 42>>,所以算法1不稳定,舍⼊误差对x 2的影响⼤.在进⾏数值计算时,如果遇到两相近数相减的情形,可通过变换计算公式来避免或减少有效数字的损失.例如,如果|x |≈0,有变换公式1cos sin sin 1cos x x xx-=+.如果x 1≈x 2,有变换公式1122lg lg lgx x x x -=.如果x 〉〉1,有变换公式.此外,⽤绝对值很⼩的数作除数时,舍⼊误差会很⼤,可能对计算结果带来严重影响.因此,要避免除数绝对值远远⼩于被除数绝对值的除法运算.如果⽆法改变算法,则采⽤增加有效位数进⾏计算,或在计算上采⽤双精度运算,但这要增加机器计算时间和多占内存单元.1.3.3 减少运算次数在数值计算中,要注意简化计算步骤,减少运算次数,这也是数值分析中所要研究的重要内容.同样⼀个计算问题,如果能减少运算次数,不但可节省计算机的计算时间,还能减少误差的积累.下⾯举例说明简化计算公式的重要性.例1.10 给定x ,计算多项式()110nn n n n P x a x a xa --=+++的值.如果我们先求ak x k ,需要进⾏k 次乘法,再相加,则总共需要()12n n +次乘法和n次加法才能得到⼀个多项式的值.如果我们将多项式写成下⾯的形式()(){}1210n n n n P x x x x a x a a a a --??=+++++?? ,则只需n 次乘法和n 次加法即可得到⼀个多项式的值,这就是著名的秦九韶算法,可描述为1,,1,2,,0,n n k k k u a u u x a k n n +=??=+=--?最后有()0n u P x =.例1.11 计算ln2的值. 解如果利⽤级数()()11ln 11nn n xx n∞+=+=-∑计算ln2,若要精确到误差的绝对值⼩于10-5,要计算10万项求和,计算量很⼤,并且舍⼊误差的积累也⼗分严重.如果改⽤级数()35211ln 213!5!21!n xx x xx x n +??+=+++++ ? ?-+??来计算ln2,取x =1,则只要计算前9项,截断误差便⼩于10-10.1.4 向量和矩阵的范数为了对矩阵计算进⾏数值分析,我们需要对向量和矩阵的“⼤⼩”引进某种度量.在解析⼏何中,向量的⼤⼩和两个向量之差的⼤⼩是⽤“长度”和“距离”的概念来度量的.在实数域中,数的⼤⼩和两个数之间的距离是通过绝对值来度量的.范数是绝对值概念的⾃然推⼴.1.4.1 向量的范数定义1.5 如果向量x ∈n R 的某个实值函数f(x )=‖x ‖满⾜ (1) 正定性:x ?0,且x =0当且仅当x =0;(2) 齐次性:对任意实数α,都有αx =|α|x ; (3) 三⾓不等式:对任意x ,y ∈R n ,都有+x y ?x +y ,则称x 为n R 上的⼀个向量范数.在n R 中,记()12,,,Tn x x x =x ,实际计算中最常⽤的向量范数有: (1) 向量的∞范数1max i i nx ∞≤≤=x;(2) 向量的1范数11nii x ==∑x;(3) 向量的2范数12221in x i ==??∑x.容易验证,向量的∞范数和1范数满⾜定义1.5中的条件.对于2范数,满⾜定义1.5中的条件(1)和(2)是显然的,对于条件(3),利⽤向量内积的Cauchy-Schwarz 不等式可以验证.更⼀般地,有如下向量的p 范数1pipn px i ==??∑x,其中p ∈ [1,+∞).容易验证1ppn∞∞≤≤xxx,由此可得如下定理.定理1.2 lim pp ∞→∞=xx.下⾯,我们利⽤向量范数的连续性来说明向量范数的重要特征.定理1.3 设给定A ∈R n ×n ,x =(x 1,x 2,…,x n )T ∈R n ,则对R n 上每⼀种向量范数,‖A x ‖都是x 1,x 2,…,x n 的n 元连续函数.证设a j 为A 的列向量,将A 写成A =(a 1,a 2,…,a n ). 则由三⾓不等式,对h =(h 1,h 2,…,h n )T ∈R n,有|‖A (x +h )‖-‖A x ‖|?‖A h ‖=‖1ni i h =∑a i ‖1ni i h =∑‖a i ‖M max|h i |,其中M=1ni =∑‖a i ‖.所以,对任意的ε>0,当max|h i |<Mε时,有|‖A (x +h )‖-‖A x ‖|<ε, 这就证明了‖A x ‖的连续性.推论1.1 ‖x ‖是x 的各分量的连续函数. 向量范数的⼀个重要特征是具有等价性.定理 1.4 R n 上的所有向量范数是彼此等价的,即对R n 上的任意两种向量范数‖x ‖s和‖x ‖t ,存在常数c 1,c 2>0,使得对任意x ,有c 1‖x ‖s ?‖x ‖t ?c 2‖x ‖s .证只要就‖x ‖s =‖x ‖∞证明上式成⽴即可,即证明存在常数c 1,c 2>0,对⼀切x ∈R n且x ≠0,有c 1‖x ‖∞?‖x ‖t ?c 2‖x ‖∞.记R n 上的有界闭集D={x :x =(x 1,x 2,…,x n )T ,‖x ‖∞=1}.由定理1.3的推论知,‖x ‖t 是D 上的n 元连续函数,所以在D 上有最⼤值c 2和最⼩值c 1,且x ∈D 时有x ≠0,故有c 2?c 1>0.现考虑x ∈R n ,且x ≠0,则有∞x x ∈D,所以有c 1?‖∞x x ‖t ?c 2, ?x ∈R n ,x ≠0.从⽽对x ≠0有c 1‖x ‖∞?‖x ‖t ?c 2‖x ‖∞.⽽x =0时上式⾃然成⽴,定理得证.由于向量范数之间具有等价性,对于范数的极限性质,我们只需对⼀种范数进⾏讨论,其余范数也都具有相似的结论.⽐如,我们可以⽅便地讨论向量序列的收敛性.定义1.6 设向量序列x (k)=()()()()12,,,Tk k k nx x x ∈R n ,k=1,2,…,若存在x *=()12 ,,,Tn x x x ***∈R n ,使得()lim k iik x x *→∞=, i =1,2,…,n,则称序列{x (k)}收敛于x *,记为()lim k ik *→∞=x x.按定义有)()lim lim 0k k k k **→∞→∞∞=?-=xx xx.⼜因为()()()12k k k c c ***∞∞-≤-≤-xxxxxx,所以有()()lim lim 0k k k k **→∞→∞=?-=xx xx.因此,若向量序列在⼀种范数下收敛,则在其他范数下也收敛.不必强调是在哪种范数意义下收敛.1.4.2矩阵的范数定义1.7 如果矩阵A ∈R n ×n 的某个实值函数f(A )=‖A ‖满⾜ (1) 正定性:‖A ‖?0,且‖A ‖=0当且仅当A =0;(2) 齐次性:对任意实数α,都有‖αA ‖=|α|‖A ‖;(3) 三⾓不等式:对任意A ,B ∈R n ×n ,都有‖A +B ‖?‖A ‖+‖B ‖; (4) 相容性:对任意A ,B ∈R n ×n ,都有‖A B ‖?‖A ‖‖B ‖;则称‖A ‖为Rn ×n上的⼀个矩阵范数.可以验证,对()ij n na ?=A ,12211Fn n a ij i j ?? ?=∑∑ ?==??A是⼀种矩阵范数,称之为Froben i us 范数,简称F 范数.由于矩阵与向量常常同时参与讨论与计算,矩阵范数与向量范数之间需要有⼀种联系. 定义1.8 对于给定的R n 上的⼀种向量范数‖x ‖和R n ×n 上的⼀种矩阵范数‖A ‖,如果满⾜‖A x ‖?‖A ‖‖x ‖,则称矩阵范数‖A ‖与向量范数‖x ‖相容.上⾯的定义1.7是矩阵范数的⼀般定义,下⾯我们通过已给的向量范数来定义与之相容的矩阵范数.定义 1.9 设x ∈R n ,A ∈R n ×n ,对给出的⼀种向量范数v x ,相应地定义⼀个矩阵的⾮负函数m axvvx v≠=A x Ax.称之为由向量范数导出的矩阵范数,也称为算⼦范数或从属范数.由定义可得vvv≤A xAx,1max vvv==xAAx.算⼦范数满⾜矩阵范数⼀般定义中的条件(1)和(2)是显然的,现验证满⾜条件(3)和(4).对任意的A ,B ∈R n ×n ,有()1maxvvv =+=+xA B x11max max v vvvvvxx==≤+=+Ax BxAB1max vvv==xABABx1max vvvvvv=≤=xABxA.因此,算⼦范数满⾜矩阵范数⼀般定义中的条件(3)和(4).由常⽤的向量范数,可以导出与其相容的矩阵算⼦范数.定理1.5 设A ∈R n ×n ,记()ij n na ?=A ,则(1)11max nij i nj a ∞≤≤==∑A,称之为矩阵A 的⾏范数;(2) 111m ax nij j ni a ≤≤==∑A ,称之为矩阵A 的列范数;(3)2=A称之为矩阵A 的2范数或谱范数,其中,()max TλA A 表⽰T A A的最⼤特征值.证这⾥只对(1)和(3)给出证明,(2)的证明同理可得. 先证明(1):设x =(x 1,x 2,…,x n )T ≠0,不妨设A ≠0,则有1111max max nnij j ij i ni nj j xa x xa ∞∞≤≤≤≤===≤∑∑A .111max max nij xi nj a ∞∞∞=≤≤===∑AAx.设矩阵A 的第p ⾏元素的绝对值之和达到最⼤,即111max nnpj ij i nj j a a ≤≤===∑∑.取向量()12,,,Tn ξξξ= ξ,其中1,0,1,0.a pj j apjξ≥??=?-显然,‖ξ‖∞=1,⽽且1111m ax m axnn∞∞=≤≤===≥==∑∑xAA xA ξ.于是(1)得证.再证明(3):显然,A TA 是对称半正定矩阵,它的全部特征值均⾮负,设为120n λλλ≥≥≥≥ .由实对称矩阵的性质,各特征值对应的特征向量必正交.设对应的标准正交特征向量为12,,,nu u u ,即T i i i λ=A Au u (i =1,2,…,n),(u i ,u j )=δi j (i ,j=1,2,…,n).对向量x ∈R n ,‖x ‖2=1,可由R n 的⼀组基u i (i =1,2,…,n)线性表⽰,即有1niii c ==∑x u ,22211nii c===∑x11nnT Ti ii i i cc λλλ====≤=∑∑A xx A A x .另⼀⽅⾯,取ξ=u 1,显然有‖ξ‖2=1,211112T T Tλλ===A ξξA A ξu u .因此,2221m ax ===xAA x得证.由定理1.5可见,计算⼀个矩阵的⾏范数和列范数是⽐较容易的,⽽矩阵的2范数计算却不⽅便,但由于它有许多好的性质,所以在理论上还是有⽤的.例1.12 设矩阵1234-??=解 {}m ax 3,77∞==A,{}1m ax 4,66==A ,10141420T-??=-A A ()21014det 3041420Tλλλλλ--==-+-I A A ,求得115λ=+215λ=-因此25.46=≈A.定义1.10 设A ∈R n ×n 的特征值为λi (i =1,2,…,n),称()1max i i nρλ≤≤=A为A 的谱半径.谱半径在⼏何上可解释为以原点为圆⼼,能包含A 的全部特征值的圆的半径中最⼩者.例1.13 计算例1.12中矩阵的谱半径.解由A 的特征⽅程()2=--=-I A得12λ=,22λ=所以() 5.372ρ=≈A .定理1.6 设A ∈R n ×n ,则有()ρ≤A A .证设A x =λx ,x ≠0,且|λ|=ρ(A ),必存在向量y ,使x y T 不是零矩阵.于是()TTTTA ρλ==≤A xyxyxyA xy,即得ρ(A )?‖A ‖.例1.14 设矩阵A 与矩阵B 是对称的,求证ρ(A +B )?ρ(A )+ρ(B ).证因T =A A ,于是有()()()222max max 2A A AA ,即‖A ‖2=ρ(A ).同理‖B ‖2=ρ(B ).由于A +B =(A +B )T,因此()()()222ρρρ+=+≤+=+A B A BABA B .定理1.7 如果‖B ‖<1,则I ±B 为⾮奇异矩阵,且()111-±≤-I B B,这⾥的矩阵范数是指矩阵的算⼦范数.证若I ±B 奇异,则存在向量x ≠0,使(I ±B )x =0,故有ρ(B )?1,这与‖B ‖<1⽭盾,所以I ±B ⾮奇异.由于()()11--±=± I B I B I B ,于是得()()11--±≤+±I B I BI B .上的任意两种矩阵范数都是等价的,即对Rn ×n上的任意两种矩阵范数sA和t A ,存在常数c 1,c 2>0,使得12stsc c ≤≤AAA.由矩阵范数的等价性,我们可以⽤矩阵的范数描述矩阵序列的极限性质.定义1.11 设矩阵序列()()()kk n nijn na ??=∈A R,k=1,2,…,若存在()n nij n na **=∈A R,使得()lim k ijijk a a *→∞()lim k k *→∞=AA.可以验证()()lim lim 0k k k k **→∞→∞=?-=AA AA.评注本章介绍了数值计算的研究对象、误差及相关概念、数值计算的稳定性及构造算法的基本原则.考虑到矩阵计算的数值分析,本章还介绍了向量范数和矩阵范数的基本概念和常⽤定理.误差分析问题是数值分析中重要⽽困难的问题.误差的基本概念和误差分析的若⼲原则,对学习本课程是很有必要的.但是,作为⼯程或科学计算的实际问题则要复杂得多,往往要根据不同问题分门别类地进⾏分析.例如,由于舍⼊误差有随机性,有⼈应⽤概率的观点研究误差规律.在⼯程计算中,常⽤⼏种不同办法(包括实验⽅法)进⾏⽐较,以确定计算结果的可靠性.20世纪60年代以来,发展了两种估计误差的理论:⼀种是J.H.W i lk i nson 等⼈针对计算机浮点算法提出了⼀套预先估计的研究误差的⽅法,使矩阵运算的舍⼊误差研究获得了新发展;另⼀种是R .E.Moore 等⼈应⽤区间分析理论估计误差,开创了研究误差的新⽅法. 关于范数⽅⾯,所述内容是为以下各章服务的⼀些初步概念和常⽤的定理,对本书够⽤就可以了.例如只讨论了R n ×n 的范数,⽽没有顾及R n ×m .⼜例如介绍了R n 和R n ×n 上范数的等价性,此性质对有限维空间都是成⽴的,⽽对于C[a,b]则没有这个性质,这些都是赋范线性空间有关的问题,详细讨论这些问题是泛函分析的内容.习题 11.1 已知e=2.71828…,问下列近似值A x 有⼏位有效数字,相对误差界是多少? (1) x =e, A x =2.7; (2) x =e, A x =2.718; (3) x =e100, A x =0.027; (4) x =e100, A x =0.02718. 1.2 设原始数据的下列近似值每位都是有效数字:1x *=1.1021, 2x *=0.031, 3x *=56.430. 试计算(1) 1x *+2x *+3x *;(2),并估计它们的相对误差界.1.3 设x 的相对误差界为δ,求n x 的相对误差界.1.4 设x >0,x 的相对误差界为δ,求ln2的绝对误差界.1.5 为了使计算球体体积时的相对误差不超过1%,问测量半径R 时的允许相对误差界是多少?1.6 三⾓函数值取4位有效数字,怎样计算1-cos2°才能保证精度? 1.7 设0Y =28,按递推公式nY=1n Y --…,计算.若取27.982(5位有效数字),试问计算Y 100将有多⼤误差?1.8 求解⽅程25610x x ++=,使其根⾄少具有4位有效数字(≈27.982).1.9 正⽅形的边长⼤约为100 cm ,应怎样测量才能使其⾯积的误差不超过21cm ? 1.10 序列{yn}满⾜递推关系1101n n y y -=-,n=1,2,….若y 0 1.41(3位有效数字),计算到y 10时的误差有多⼤?这个计算过程稳定吗?1.11 对积分11n x n I x edx -=,n=0,1,…,验证101I e-=-,11n n I nI -=-.若取e -1≈0.3679,按递推公式11n n I nI -=-,⽤4位有效数字计算I 0,I 1,…,I 9,并证明这种算法是不稳定的.1.12 反双曲正弦函数为()(ln f x x =+.如何计算f(x )才能避免有效数字的损(1) sin x -siny ; (2) arctan x -arctany ;(3)2; (4)212xe-.1.14 已知三⾓形⾯积1sin 2s ab C=,其中C 为弧度,0π,且测量a,b,C 的误差分别为Δa,Δb,ΔC ,证明⾯积的误差Δs 满⾜s a b C s ab C≤++ .1.15 设P ∈R n ×n 且⾮奇异,⼜设‖x ‖为R n 上的⼀种向量范数,定义p=xP x.试证明‖x‖P 是R n 上的⼀种向量范数.1.16 设A ∈R n ×n 为对称正定矩阵,定义()12,A=xA x x .试证明‖x‖A 为R n 上的⼀种向量范数.1.17 设矩阵0.60.50.10.3??=2F≤≤AA,并说明‖A ‖F 与‖x‖2相容.1.19 设P ∈Rn ×n且⾮奇异,⼜设‖x‖为R n上的⼀种向量范数,定义范数‖x‖P =‖P x ‖.证明对应于‖x‖P 的算⼦范数1 p-=APAP.1.20 设A 为⾮奇异矩阵,求证:11m iny ∞-≠∞∞=A y yA.。

n+1的算法

n+1的算法

n+1的算法
1. 首先,让我们来了解n+1的算法是什么意思。

n+1的算法是一种数学算法,用于将给定的数字n加上1。

这个算法可以应用于各种领域,包括计算机科学、数学和物理等。

2. 在计算机科学中,n+1的算法通常用于循环和迭代的计算。

例如,在编程语言中,我们经常需要对一个变量进行递增操作,而n+1的算法就是一种常用的方法。

通过将n加上1,我们可以得到一个新的值,使得变量的值增加1。

3. 在数学中,n+1的算法可以用于求解数学问题。

例如,在代数中,我们经常需要对方程或表达式进行变换和计算。

使用n+1的算法,我们可以将给定的数值n增加1,从而得到一个新的数值,用于进一步计算和推导。

4. 在物理学中,n+1的算法可以用于模拟和计算物理系统的行为。

例如,在运动学中,我们经常需要对物体的位置和速度进行计算。

通过使用n+1的算法,我们可以将物体的位置增加1,从而模拟物体在下一个时间步骤中的位置和速度。

5. 总结一下,n+1的算法是一种数学算法,用于将给定的数字n加上1。

它可以应用于各种领域,包括计算机科学、数学和物理等。

在计算机科学中,它通常用于循环和迭代的计算。

在数学中,它可以用于求解数学问题。

在物理学中,它可以用于模拟和计算物理系统的行为。

无论在哪个领域,n+1的算法都是一种
常用且简单的方法,可以帮助我们进行各种计算和推导。

C语言常用算法归纳

C语言常用算法归纳

C语言常用算法归纳应当掌握的一般算法一、基本算法:交换、累加、累乘二、非数值计算常用经典算法:穷举、排序(冒泡,选择)、查找(顺序即线性)三、数值计算常用经典算法:级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法)四、其他:迭代、进制转换、矩阵转置、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形)详细讲解一、基本算法1.交换(两量交换借助第三者)例1、任意读入两个整数,将二者的值交换后输出。

main(){ int a,b,t;scanf("%d%d",&a,&b);printf("%d,%d\n",a,b);t=a; a=b; b=t;printf("%d,%d\n",a,b);}【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!【应用】例2、任意读入三个整数,然后按从小到大的顺序输出。

main(){ int a,b,c,t;scanf("%d%d%d",&a,&b,&c);/*以下两个if语句使得a中存放的数最小*/if(a>b){ t=a; a=b; b=t; }if(a>c){ t=a; a=c; c=t; }/*以下if语句使得b中存放的数次小*/if(b>c) { t=b; b=c; c=t; }printf("%d,%d,%d\n",a,b,c);}2.累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。

c 数值算法

c 数值算法

c 数值算法
C语言是一门广泛应用于科学计算、数据分析和各种数值处理领域的编程语言,因此C语言提供了很多数值算法,例如:
1. 数值积分算法:C语言中提供了一些常见的积分算法,如梯形积分法、辛普森积分法等,可以用来求解各种函数的积分值。

2. 矩阵运算算法:C语言提供了丰富的矩阵运算功能,包括矩阵的加减乘除、转置和求逆等运算,可以用于线性代数和统计学中的各种问题。

3. 最优化算法:C语言中提供了一些最优化算法,如梯度下降法、共轭梯度法等,用于求解约束或非约束条件下的最小值或最大值。

4. 随机数生成算法:C语言的标准库中提供了用于随机数生成的函数,如rand()和srand(),可用于各种需要随机数的场合。

5. 插值算法:C语言中提供了一些插值算法,如拉格朗日插值法、三次样条插值法等,可以用于数值逼近和数据拟合等问题。

总之,C语言提供了许多数值算法,可以用于各种数学、统计和科学计算的问题,这些算法往往被广泛应用于金融、物理、天文、地质和生物等领域,对于实现各种数值处理方案都具有重要的作用。

几种数值积分算法的误差分析

几种数值积分算法的误差分析

Sn

h 6
f
n1
(a) 2
k 1
f
n
(xk ) 4
k 1
f
(
x k

1
)

2
f
(b)

(3)复化Cotes求积公式
h
n1
3
n1
n1

Cn

90
7
f
(a) 32( (
k 0
f
(
x k

1
)

4
f
(xk

4
))

12
k
0
(
x k
1、Newton-Cotes求积公式的误差分析
(1)梯形公式的截断误差 (2)辛普森公式截断误差 (3)柯特斯公式截断误差
RT

f ( ) (b a)3, 12
(a,b)
RS
(b a)5 2880
f
(4) ( ), (a,b)
RC


2(b a) 945
(b
一、几种数值积分的算法
1、Newton-Cotes求积公式
(1)梯形公式(n=1)
b f (x)dx T b af (a) f (b)
a
2
(2)Simpson(辛普森)公式(n=2)
b
f (x)dx S
a

b
6
a
f
(a)

4
f
(a
2
b)

f
(b)
(3)Cotes公式(n=4)
b

数值计算方法及其在工程中的应用

数值计算方法及其在工程中的应用

数值计算方法及其在工程中的应用数值计算是以计算机为工具,通过数值分析、计算和模拟等手段,对实际问题进行数值模拟和解析的一种方法。

它在科学计算、工程技术和经济管理等领域都有广泛的应用。

本文将从数值计算方法的基本原理、常见方法及其在工程中的应用等方面进行探讨。

一、数值计算方法的基本原理1.数学模型数学模型是研究问题的基础。

它在数值计算中的作用,就相当于实验中的试验模型。

数学模型的形式很多,例如微分方程、积分方程、概率模型等等。

这些模型中的各个参量和变量都需要通过实际测量或计算得到。

2.离散化在数值计算过程中,数学模型需要离散化,将其转化为有限个变量的函数。

这样才能实现数值计算的可行性。

离散化一般是将问题分成若干个小部分,每个小部分单独处理,并用数值计算方法连接起来。

3.差分格式差分格式是数值计算的核心内容之一。

它是一种将微分方程转化为差分方程的方法。

在差分格式中,一般使用有限差分法,通过对问题进行离散,用有限差分法求得差分方程的解,然后通过插值等一系列方法将其还原为原问题的解。

4.误差分析误差分析是数值计算过程中必不可少的一部分。

由于数值计算不能完全精确,因此需要对数值结果的误差进行分析。

误差分为截断误差、舍入误差、稳定性误差等等。

误差分析不仅能够评估计算精确度,还能够指导计算过程的优化。

二、数值计算方法的常见方法1. 数值积分数值积分是数值计算的基本内容之一。

它的主要目的是从一定的数据集中寻找积分值。

数值积分算法常见的有梯形公式、辛普森公式、高斯公式等。

数值积分广泛应用于工程领域,特别是在机械工程、电力工程和天文学上,能够帮助工程师更好地处理与积分有关的问题。

2. 数值微分数值微分是利用离散化的方法,对微分算子逼近的一种方法。

数值微分算法常见的有欧拉法、龙格 -库塔法等。

数值微分主要在数值模拟和优化处理方面发挥作用,例如在工程领域应用中,可以帮助工程师根据实际数据得出微分值,以评估机器设备的效果。

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

//********************************************************//如果某个自然数除了1和它本身外还有其他约数,则这个自然数//是一个合数(非素数)。

试定义一个类NOPRIME,从3开始向上试探//找出n个连续的自然数,且它们都是合数。

当找到第一组连续的//合数后,即停止查找。

注意:n为自己设定的数。

//********************************************************#include<iostream.h>class NOPRIME{int n;int *p; //存储n个数public:NOPRIME(int nn):n(nn){p=new int[n];}~NOPRIME(){delete []p;}int yes(int m) //判断是否是合数{int i=0; //计数使用for(int j=2;j<m;++j){if(m%j)i++;}if(i==m-2) //素数return 0;else //合数return 1;}void search() //查找n个连续的合数{int i=3,j=0,k=0; //i为题目要求从3开始,j为计数的变量,k也为计数的变量while(1){if(yes(i)){p[k]=i;++j; //j记录赋值的次数++k; //指针的第k+1个位置}else{j=0;k=0;}if(j==n)break;else++i;}}void print(){for(int i=0;i<n;++i){cout<<p[i]<<" ";if(!((i+1)%10))cout<<endl;}cout<<endl;}};void main(){NOPRIME nn(10);nn.search();nn.print();}//***************************************************************************** *//题目要求:设有一个包含size个数的数列,要求能够把从指定位置m开始的n个数排列成降//序,并输出新的完整的数列。

可将数列存放在一个一维数组中。

例如,原数列有10个数,//值为{1,8,3,0,5,9,7,6,9,8},若要求把从第4个开始的5个数排成降序,则得到的新数列//为{1,8,3,9,7,6,5,0,9,8}。

试建立一个类LIST,来完成上述功能。

//***************************************************************************** *#include<iostream.h>class LIST{int *p;int size;public:LIST(int a[],int len):size(len){p=new int[size];for(int i=0;i<size;++i)p[i]=a[i];}~LIST(){delete []p;}void sortpart(int m,int n){int temp;for(int i=0;i<n;++i) //循环n次,每次排好最后一个for(int j=m-1;j<m-1+n-1;++j) //从第m个数开始排序,注意:第m个数在数列中位m-1{if(p[j]<p[j+1]){temp=p[j];p[j]=p[j+1];p[j+1]=temp;}}}void print()const{for(int i=0;i<size;++i)cout<<p[i]<<" ";cout<<endl;}};void main(){int a[]={1,8,3,0,5,9,7,6,9,8};int length=sizeof(a)/sizeof(a[0]);LIST l(a,length);l.print();l.sortpart(4,5);l.print();}//***************************************************************************//求两个整数集合的并集://题目要求:整数集合是由多个不同的整数构成,可将其存放在一个一维整型数组中。

//两个集合的并集由属于两个集合的全体元素构成,注意不能出现重复元素。

例如://集合a[]={1,3,5,7,9},集合b[]={1,2,3,4,5,6},它们的并集是c[]={1,3,5,7,9,2,4,6}//求并集的算法是:先将a数组中的全体元素放入c数组,再依次判断b数组中的每一个//元素b[i],如果b[i]不属于数组a,则将b[i]加入c数组。

试建立一个类SET,完成求//两个整数集合的并集。

//***************************************************************************//注:按照原题意写的代码//***************************************************************************#include<iostream.h>class SET{int a[20],b[20],c[20];int L1,L2,L3; //分别存储a,b,c三个数组中元素的真实个数public:SET(int aa[],int len1,int bb[],int len2):L1(len1),L2(len2),L3(0) //c的真实个数暂时设为0 {for(int i=0;i<L1;++i)a[i]=aa[i];for(i=0;i<L2;++i)b[i]=bb[i];}~SET(){}void process(); //进行并集处理的函数void print();int yes(int b[],int); //判断b[i]是否在a中};int SET::yes(int b[],int i) //判断b[i]是否在a中{int num=0; //记录循环次数for(int j=0;j<L1;j++){if(b[i]!=a[j])++num;}if(num==L1) //b[i]不在a中,循环L1次没有找到与b[i]相等的数return 1;elsereturn 0;void SET::process() //进行并集处理的函数{int i=L1,j=0,num=0; //temp记录while循环的次数for(i=0;i<L1;i++) //将a复制给c{c[i]=a[i];}for(j=0;j<L2;++j) //与下面的while语句的功能相同{if(yes(b,j)){c[i]=b[j];++num; //计算b中元素不在a中的个数++i;}}/* while(1) //将b不在a中的元素加入到c中{if(yes(b,j)) //注意i与j的不同作用,很重要{c[i]=b[j];++num; //计算b中元素不在a中的个数++i;}++j;if(j>=L2)break;}*/L3=L1+num; //最终确定c的长度}void SET::print(){for(int i=0;i<L1;++i){cout<<a[i]<<" ";}cout<<"与";for(i=0;i<L2;++i){cout<<b[i]<<" ";}cout<<"的并集为:"<<endl;for(i=0;i<L3;++i){cout<<c[i]<<" ";// if((i+1)%5==0)// cout<<endl;}cout<<endl;}void main(){int a[]={1,3,5,7,9},b[]={1,2,3,4,5,6};int num1=sizeof(a)/sizeof(a[0]),num2=sizeof(b)/sizeof(b[0]); //分别存储a,b数组中元素的个数SET s(a,num1,b,num2);s.process();s.print();}。

相关文档
最新文档