南昌大学数值分析实验报告
- 格式:doc
- 大小:344.50 KB
- 文档页数:20
数值分析实验报告【引言】数值分析是一门研究利用计算机和数学方法解决实际问题的学科,它在工程、科学和经济领域中有着广泛的应用。
在这个实验报告中,我将分享我在数值分析实验中的一些发现和结果。
【实验目的】本次实验的目的是通过数值方法对给定的问题进行求解,并分析数值方法的精确性和稳定性。
我们选择了经典的插值和数值积分问题来进行实验。
【实验过程】在插值问题中,我使用了拉格朗日插值和样条插值两种方法。
通过使用已知的数据点,这些方法能够通过构造多项式函数来逼近原始函数,从而能够在未知点上进行预测。
通过比较两种插值方法的结果,我发现拉格朗日插值在低维数据上表现更好,而样条插值在高维数据上更能保持插值曲线的平滑性。
在数值积分问题中,我使用了复合梯形公式和复合辛普森公式来进行数值积分。
这两种方法可以将复杂的区间上的积分问题转化为对若干个小区间进行数值积分的问题。
实验结果表明,复合辛普森公式在使用相同的步长时,其数值积分结果更为精确。
【实验结果】我以一个实际问题作为例子来展示实验结果。
问题是计算半径为1的圆的面积。
通过离散化的方法,我将圆划分为多个小的扇形区域,并使用数值积分方法计算每个扇形的面积。
最后将每个扇形的面积相加,即可得到圆的近似面积。
通过调整离散化的精度,我发现随着扇形数量的增加,计算得到的圆的面积越接近真实的圆的面积。
在插值问题中,我选择了一段经典的函数进行插值研究。
通过选择不同的插值节点和插值方法,我发现当插值节点越密集时,插值结果越接近原函数。
同时,样条插值方法在高阶导数连续的情况下能够更好地逼近原始函数。
【实验总结】通过这次实验,我对数值分析中的插值和数值积分方法有了更深入的理解。
我了解到不同的数值方法在不同的问题中有着不同的适用性和精确度。
在实际应用中,我们需要根据具体问题选择合适的数值方法,并进行必要的数值计算和分析,以获得准确可靠的结果。
总的来说,数值分析作为一种重要的工具和方法,在科学研究和工程实践中具有广泛的应用,并且不断发展和创新。
一、实验目的通过本次综合实验,掌握数值分析中常用的插值方法、方程求根方法以及数值积分方法,了解这些方法在实际问题中的应用,提高数值计算能力。
二、实验内容1. 插值方法(1)拉格朗日插值法:利用已知数据点构造多项式,以逼近未知函数。
(2)牛顿插值法:在拉格朗日插值法的基础上,通过增加基函数,提高逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,通过不断缩小区间来逼近根。
(2)Newton法:利用函数的导数信息,通过迭代逼近根。
(3)不动点迭代法:将方程转化为不动点问题,通过迭代逼近根。
3. 数值积分方法(1)矩形法:将积分区间等分,近似计算函数值的和。
(2)梯形法:将积分区间分成若干等分,用梯形面积近似计算积分。
(3)辛普森法:在梯形法的基础上,将每个小区间再等分,提高逼近精度。
三、实验步骤1. 拉格朗日插值法(1)输入已知数据点,构造拉格朗日插值多项式。
(2)计算插值多项式在未知点的函数值。
2. 牛顿插值法(1)输入已知数据点,构造牛顿插值多项式。
(2)计算插值多项式在未知点的函数值。
3. 方程求根方法(1)输入方程和初始值。
(2)选择求解方法(二分法、Newton法、不动点迭代法)。
(3)迭代计算,直到满足精度要求。
4. 数值积分方法(1)输入被积函数和积分区间。
(2)选择积分方法(矩形法、梯形法、辛普森法)。
(3)计算积分值。
四、实验结果与分析1. 插值方法(1)拉格朗日插值法:通过构造多项式,可以较好地逼近已知数据点。
(2)牛顿插值法:在拉格朗日插值法的基础上,增加了基函数,提高了逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,计算简单,但收敛速度较慢。
(2)Newton法:利用函数的导数信息,收敛速度较快,但可能存在数值不稳定问题。
(3)不动点迭代法:将方程转化为不动点问题,收敛速度较快,但可能存在初始值选择不当的问题。
3. 数值积分方法(1)矩形法:计算简单,但精度较低。
数值分析实验实验报告数值分析实验实验报告一、引言数值分析是一门研究如何利用计算机对数学问题进行数值计算和模拟的学科。
在实际应用中,数值分析广泛应用于工程、物理、金融等领域。
本实验旨在通过实际操作,探索数值分析方法在实际问题中的应用,并通过实验结果对比和分析,验证数值分析方法的有效性和可靠性。
二、实验目的本实验的主要目的是通过数值分析方法,解决一个实际问题,并对比不同方法的结果,评估其准确性和效率。
具体来说,我们将使用牛顿插值法和拉格朗日插值法对一组给定的数据进行插值,并对比两种方法的结果。
三、实验步骤1. 收集实验数据:我们首先需要收集一组实验数据,这些数据可以来自实验测量、调查问卷等方式。
在本实验中,我们假设已经获得了一组数据,包括自变量x和因变量y。
2. 牛顿插值法:牛顿插值法是一种基于差商的插值方法。
我们可以通过给定的数据点,构造一个插值多项式,并利用该多项式对其他点进行插值计算。
具体的计算步骤可以参考数值分析教材。
3. 拉格朗日插值法:拉格朗日插值法是另一种常用的插值方法。
它通过构造一个满足给定数据点的多项式,利用该多项式对其他点进行插值计算。
具体的计算步骤也可以参考数值分析教材。
4. 结果比较与分析:在完成牛顿插值法和拉格朗日插值法的计算后,我们将比较两种方法的结果,并进行分析。
主要考虑的因素包括插值误差、计算效率等。
四、实验结果在本实验中,我们选取了一组数据进行插值计算,并得到了牛顿插值法和拉格朗日插值法的结果。
经过比较和分析,我们得出以下结论:1. 插值误差:通过计算插值点与实际数据点之间的差值,我们可以评估插值方法的准确性。
在本实验中,我们发现牛顿插值法和拉格朗日插值法的插值误差都较小,但是拉格朗日插值法的误差稍大一些。
2. 计算效率:计算效率是衡量数值分析方法的重要指标之一。
在本实验中,我们发现牛顿插值法的计算速度较快,而拉格朗日插值法的计算速度稍慢。
五、实验结论通过本实验,我们对数值分析方法在实际问题中的应用有了更深入的了解。
实验报告实验课程:数值分析学生姓名:郑俊学号:6100410235专业班级:计算机科学与技术103班2012年 06 月 6日目录一、用样条插值法差值的方法生成字体T的轮廓 (3)二、用样条插值法差值的方法生成字体5的轮廓 (10)三、用最小二乘法估计原子弹爆炸的能量 (14)南昌大学实验报告一姓名: 郑俊 学 号: 6100410235 专业班级:计算机科学与技术103班 实验类型:□验证 □ 综合■设计 □创新 实验日期:2012-5 实验成绩:一、 实验目的1:用样条插值的方法生成字体T 的轮廓 2:C 语言用Bezier 曲线生成并编写程序二、 实验基本原理和内容P 0x P 0y P 1x P 1y P 2x P 2y P 3x P 3y 237 620 237 620 237 120 237 120 237 120 237 35 226 24 143 19 143 19 143 19 143 0 143 0 143 0 143 0 435 0 435 0 435 0 435 0 435 19 435 19 435 19 353 23 339 36 339 109 339 109 339 108 339 620 339 620 339 620 507 620 529 602 552 492 552 492 552 492 576 492 576 492 576 492 576 492 570 662 570 662 570 662 570 662 6 662 6 662 6 662 6 662 0 492 0 492 0 492 0 492 24 492 24 492 24 492 48 662 71 620 183 620 183620183620237620237620Bezier 曲线生成:1、确定曲线的阶次; 2 计算Bernstein 基函数的表达式:2、生成字体T 共分成15段,每段用了三次的代数方程,用Bezier 曲线生成:当n=3时303333,3212233,2221133,1330033,0)1()()1(3)1()()1(3)1()()1()1()(t t t C t B t t t t C t B t t t t C t B t t t C t B =-=-=-=-=-=-=-=nk t t t k n k n t t C t B kn k k n kk n n k ,,1,0]1,0[)1()!(!!)1()(, =∈--=-=--其中]1,0[∈t)()()()()(3,333,223,113,00t B P t B P t B P t B P t P +++=3、 把Bezier 曲线中的Pk 写成分量坐标的形式4 、确定一合适的步长;控制t 从0到1变化,求出一系列(x,y)坐标点;将其用小线段顺序连接起来。
第1篇在数值分析这门课程的学习过程中,我深刻体会到了理论知识与实践操作相结合的重要性。
通过一系列的实验,我对数值分析的基本概念、方法和应用有了更加深入的理解。
以下是我对数值分析实验的心得体会。
一、实验目的与意义1. 巩固数值分析理论知识:通过实验,将课堂上学到的理论知识应用到实际问题中,加深对数值分析概念和方法的理解。
2. 培养实际操作能力:实验过程中,我学会了使用Matlab等软件进行数值计算,提高了编程能力。
3. 增强解决实际问题的能力:实验项目涉及多个领域,通过解决实际问题,提高了我的问题分析和解决能力。
4. 培养团队协作精神:实验过程中,我与同学们分工合作,共同完成任务,培养了团队协作精神。
二、实验内容及方法1. 实验一:拉格朗日插值法与牛顿插值法(1)实验目的:掌握拉格朗日插值法和牛顿插值法的原理,能够运用这两种方法进行函数逼近。
(2)实验方法:首先,我们选择一组数据点,然后利用拉格朗日插值法和牛顿插值法构造插值多项式。
最后,我们将插值多项式与原始函数进行比较,分析误差。
2. 实验二:方程求根(1)实验目的:掌握二分法、Newton法、不动点迭代法、弦截法等方程求根方法,能够运用这些方法求解非线性方程的根。
(2)实验方法:首先,我们选择一个非线性方程,然后运用二分法、Newton法、不动点迭代法、弦截法等方法求解方程的根。
最后,比较不同方法的收敛速度和精度。
3. 实验三:线性方程组求解(1)实验目的:掌握高斯消元法、矩阵分解法等线性方程组求解方法,能够运用这些方法求解线性方程组。
(2)实验方法:首先,我们构造一个线性方程组,然后运用高斯消元法、矩阵分解法等方法求解方程组。
最后,比较不同方法的计算量和精度。
4. 实验四:多元统计分析(1)实验目的:掌握多元统计分析的基本方法,能够运用这些方法对数据进行分析。
(2)实验方法:首先,我们收集一组多元数据,然后运用主成分分析、因子分析等方法对数据进行降维。
一、实验背景数值分析是研究数值计算方法及其理论的学科,是计算机科学、数学、物理学等领域的重要基础。
为了提高自身对数值分析理论和方法的理解,我们进行了数值分析实验,通过实验加深对理论知识的掌握,提高实际操作能力。
二、实验目的1. 理解数值分析的基本理论和方法;2. 掌握数值分析实验的基本步骤和技巧;3. 培养实验设计和数据分析能力;4. 提高编程和计算能力。
三、实验内容本次实验主要分为以下几个部分:1. 线性方程组求解实验:通过高斯消元法、LU分解法等求解线性方程组,并分析算法的稳定性和误差;2. 矩阵特征值问题计算实验:利用幂法、逆幂法等计算矩阵的特征值和特征向量,分析算法的收敛性和精度;3. 非线性方程求根实验:运用二分法、牛顿法、不动点迭代法等求解非线性方程的根,比较不同算法的优缺点;4. 函数插值实验:运用拉格朗日插值、牛顿插值等方法对给定的函数进行插值,分析插值误差;5. 常微分方程初值问题数值解法实验:运用欧拉法、改进的欧拉法、龙格-库塔法等求解常微分方程初值问题,比较不同算法的稳定性和精度。
四、实验过程1. 线性方程组求解实验:首先,编写程序实现高斯消元法、LU分解法等算法;然后,对给定的线性方程组进行求解,记录计算结果;最后,分析算法的稳定性和误差。
2. 矩阵特征值问题计算实验:编写程序实现幂法、逆幂法等算法;然后,对给定的矩阵进行特征值和特征向量的计算,记录计算结果;最后,分析算法的收敛性和精度。
3. 非线性方程求根实验:编写程序实现二分法、牛顿法、不动点迭代法等算法;然后,对给定的非线性方程进行求根,记录计算结果;最后,比较不同算法的优缺点。
4. 函数插值实验:编写程序实现拉格朗日插值、牛顿插值等方法;然后,对给定的函数进行插值,记录计算结果;最后,分析插值误差。
5. 常微分方程初值问题数值解法实验:编写程序实现欧拉法、改进的欧拉法、龙格-库塔法等算法;然后,对给定的常微分方程初值问题进行求解,记录计算结果;最后,比较不同算法的稳定性和精度。
学生姓名: 学 号: 专业班级:实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 3.15 实验成绩: _MATLAB 基础上机训练二一、 实验项目名称:MATLAB 基础上机训练二二、 实验目的:1、熟悉掌握Matlab 的基本关系运算符,逻辑运算符,和简单的循环结构,流程控制。
2、掌握线性代数和矩阵的计算以及数据分析。
三、实验说明:第四章1、要求n ,使n !是一个100位数字的最小值。
2、输入数据n ,判断其奇偶性。
第五章1、设⎪⎩⎪⎨⎧=+=++=++1,223,132********x x x x x x x x 利用两种方法求x 1,x 2以及x 3 。
2、设A=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡5210150110520125,试利用MATLAB 求其特征值与特征向量。
3、设B=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1817161514131211109876543,试利用MATLAB 产生向量C 1=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡161284,C 2=[7 8 910],C 3=⎥⎦⎤⎢⎣⎡18171413,C 4=[4 8 13 18]学生姓名: 潘书敏 学 号: 6100210062 专业班级: 通信101 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 3.15 实验成绩: _4、设D 1=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡161284,D 2=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡10987,试利用MATLAB 产生向量D 3=⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡10169128874,D 4=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡5412310987161284。
第六章1、设y 1=2x 4+4x 3+2x+1,y 2=2x 2+1,试利用MATLAB 求y 1+y 2,y 1-y 2,y 1÷y 2以及 y 1*y 2。
2、设y=2x 4+5x 3+4x+1,试利用MATLAB 求该多项式的根、dxdv以及在区间[-1,3]内100点的值并作图表示。
《数值分析》课程实验报告数值分析实验报告《数值分析》课程实验报告姓名:学号:学院:机电学院日期:20__ 年 _ 月_ 日目录实验一函数插值方法 1 实验二函数逼近与曲线拟合 5 实验三数值积分与数值微分 7 实验四线方程组的直接解法 9 实验五解线性方程组的迭代法 15 实验六非线性方程求根 19 实验七矩阵特征值问题计算 21 实验八常微分方程初值问题数值解法 24 实验一函数插值方法一、问题提出对于给定的一元函数的n+1个节点值。
试用Lagrange公式求其插值多项式或分段二次Lagrange插值多项式。
数据如下:(1) 0.4 0.55 0.65 0.80 0.95 1.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。
(提示:结果为, )(2) 1 2 3 4 5 6 7 0.368 0.135 0.050 0.018 0.007 0.002 0.001 试构造Lagrange多项式,计算的,值。
(提示:结果为, )二、要求 1、利用Lagrange插值公式编写出插值多项式程序;2、给出插值多项式或分段三次插值多项式的表达式;3、根据节点选取原则,对问题(2)用三点插值或二点插值,其结果如何;4、对此插值问题用Newton插值多项式其结果如何。
Newton 插值多项式如下:其中:三、目的和意义 1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题;2、明确插值多项式和分段插值多项式各自的优缺点;3、熟悉插值方法的程序编制;4、如果绘出插值函数的曲线,观察其光滑性。
四、实验步骤(1) 0.4 0.55 0.65 0.80 0.951.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。
武汉理工大学学生实验报告书实验课程名称数值分析开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级2010—2010学年第一学期实验课程名称:数值分析第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)(1)用拉格朗日插值法计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(2)利用二次插值计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(3)用艾尔米特插值法计算时,f(x)的插值多项式H5(x)=(1+4*x)*(x-0.5)*(x-0.5)*(x-2)*(x-2)+(3.90807-6.03838*x)*(x-2)*(x-2)*x*x+(2.34573-4.16674*x)*x*x*(x-0.5)*(x-0.5)(4)各插值算法的精度差异比较经过比较,拉格朗日插值法要比牛顿插值法算法的计算量多一些,拉格朗日插值法后一次计算时用到了前一次计算的结果,提高了运算的效率,但拉格朗日插值法在构造艾尔米特插值法时很方便,将坐标点和对应的导数结合起来的精度比线性插值的精度又要高一些。
但从实验数据来看,在坐标不是很多的情况下,已知的点越多精度也就相对较高。
对于实验要求的第二组数据用拉格朗日插值法(或者牛顿插值法)实验结果如下:一下分别是二阶、三阶、四阶、五阶插值得到的结果以上只是实验结果的一部分,改变插值的位置时,得到的实验结果精度也是有所不同的。
由以上结果分析可知,插值次数并不是越多越好,多了反而会让结果更加偏离真实结果,这充分说明了高次插值存在“病态性质”,在已知点很多的情况下应该采用分段低次插值,将拉格朗日插值法和牛顿插值法运用到分段低次插值法当中,这样得到的结果可能胡更加精确。
数值分析的实验报告实验目的本实验旨在通过数值分析方法,探讨数学问题的近似解法,并通过实际案例进行验证和分析。
具体目的包括: 1. 理解和掌握数值分析的基本原理和方法; 2. 学会使用计算机编程语言实现数值分析算法; 3. 分析数值分析算法的精确性和稳定性; 4. 根据实验结果对数值分析算法进行优化和改进。
实验步骤1. 问题描述首先,我们选择一个数学问题作为实验的对象。
在本次实验中,我们选取了求解非线性方程的问题。
具体而言,我们希望找到方程 f(x) = 0 的解。
2. 数值方法选择根据非线性方程求解的特点,我们选择了牛顿迭代法作为数值方法。
该方法通过不断迭代逼近方程的解,并具有较好的收敛性和精确性。
3. 程序设计与实现为了实现牛顿迭代法,我们使用了Python编程语言,并使用了相应的数值计算库。
具体的程序实现包括定义方程 f(x) 和其导数f’(x),以及实现牛顿迭代法的迭代过程。
4. 实验案例与结果分析我们选择了一个具体的方程,例如 x^3 - 2x - 5 = 0,并通过程序运行得到了方程的解。
通过比较实际解与数值解的差异,我们可以分析数值方法的精确性和稳定性。
5. 优化与改进基于实验结果的分析,我们可以对数值分析算法进行优化和改进。
例如,通过调整迭代的初始值、增加迭代次数或修改算法公式等方式,改进算法的收敛性和精确性。
实验结论通过本次实验,我们深入理解了数值分析的基本原理和方法,并通过具体案例验证了牛顿迭代法的有效性。
同时,我们也意识到数值分析算法的局限性,并提出了一些改进的建议。
在今后的数学问题求解中,我们可以运用数值分析的方法,通过计算机编程实现更精确的近似解。
实验报告实验课程:数值分析学生名称:学号:专业班级:2012年 6月1日目录一.用样条插值法插值的方法生成字体T、5的轮廓 (3)二.原子弹爆炸的能量估计 (14)三.PageRank算法 (17)南昌大学实验报告一姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:一、实验目的1、用样条插值的方法生成字体T的轮廓2、C或C++语言用Bezier曲线生成并编写程序二、实验要求1、熟悉三次样条插值有关理论,并能将其运用到实际中,加深对理论知识的理解;2、要求会编程实现Bezier样条曲线,并根据所给数据绘制‘T’的轮廓。
三、主要仪器设备及耗材PC微机Windows 操作系统VS集成开发环境VS0集成开发环境的MSDN四、实验基本原理和内容Times-Roman T的数据X0 Y0 X1 Y1 X2 Y2 X3 Y3 237 620 237 620 237 120 237 120 237 120 237 35 226 24 143 19 143 19 143 19 143 0 143 0 143 0 143 0 435 0 435 0 435 0 435 0 435 19 435 19 435 19 353 23 339 36 339 109 339 109 339 108 339 620 339 620 339 620 507 620 529 602 552 492 552 492 552 492 576 492 576 492 576 492 576 492 570 662 570 662 570 662 570 662 6 662 6 662 6 662 6 662 0 492 0 492 0 492 0 492 24 492 24 492 24 492 48 602 71 620 183 620 183 620 183 620 237 620 237 620Times-Roman 5的数据X0 Y0 X1 Y1 X2 Y2 X3 Y3 149 597 149 597 149 597 345 597 345 597 761 597 365 599 368 606 368 606 406 695 368 606 406 695 406 695 397 702 406 695 397 702 397 702 382 681 372 676 351 676 351 676 351 676 351 676 142 676 142 676 33 439 142 676 33 439 33 439 32 438 32 436 32 434 32 434 32 428 35 426 44 426 44 426 74 426 109 420 149 408 149 408 269 372 324 310 324 208 324 208 324 112 264 37 185 37 185 37 165 37 149 44 119 66 119 66 86 90 65 99 42 99 42 99 14 99 0 87 0 62 0 62 0 24 46 0 121 0 121 0 205 0 282 27 333 78 333 78 378 123 399 180 399 256 399 256 399 327 381 372 333 422 333 422 288 468 232 491 112 512 112 512 112 512 149 597 149 597实验原理:所谓Bezier 曲线,是应用于二维应用程序的数学曲线。
曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的 中间点。
滑动两个中间点,贝塞尔曲线的形状会发生变化。
该曲线公式为:假设给出n+1个 控制点位置:p k =(x k ,y k ),0≤k≤n ,这些坐标点将混合产生下列位置向量P (u),用来描述p 0和 p n 间逼近Bezier 多项式的路径,∑==nk nk,(u)kBEZ(u)p P ,0≤k≤1,BEZ k,n (u)是Bezier 混合函数——Bernstein 多项式:BEZ k,n (u)=C(n,k)u k(1-u)n-k,参数C(n,k)是二项式系数:k )!(n k!n!k)C(n,-=。
多数时候,Bezier 曲线是一个阶数比控制点少1的多项式,即4点可以生成一个三次曲线。
C(n,k)=(n-k+1)/k×C(n,k-1),在n≥k 时满足BEZ k,n (u)=(1-u)BEZ k,n-1(u)+uBEZ k -1,n-1(u),得函数:void binomialCoefficent(GLint n,GLint *c)和void computeBezPnt(GLfloat u,Point2D*bezPnt,GLint nCtrlPnts,Point2D *ctrlPnts,GLint *c)三次Bezier 曲线有四个控制点,我们将n=3代入曲线方程中得到BEZ 0,3=(1-u)3,BEZ 1,3=3u(1-u)2,BEZ 2,3=3u 2(1-u),BEZ 3,3=u 3。
得函数void bezier(Point2D*ctrlPnts,GLintnCtrlPnts,GLint nBezCurvePnts)。
Bezier 曲线生成:1、确定曲线的阶次; 2 计算Bernstein 基函数的表达式:生成字体T 共分成15段,每段用了三次的代数方程,用Bezier 曲线生成当n=3时303333,3212233,2221133,1330033,0)1()()1(3)1()()1(3)1()()1()1()(t t t C t B t t t t C t B t t t t C t B t t t C t B =-=-=-=-=-=-=-=nk t t t k n k n t t C t B kn k k n k k n n k ,,1,0]1,0[)1()!(!!)1()(, =∈--=-=--其中]1,0[∈t)()()()()(3,333,223,113,00t B P t B P t B P t B P t P +++=3 把Bezier 曲线中的Pk 写成分量坐标的形式4 确定一合适的步长;控制t 从0到1变化,求出一系列(x,y)坐标点;将其用小线段顺序连接起来。
算法描述:对于二维平面的情况,只有x,y 坐标分量,可以给出四点三次Bezier 曲线如下的算法描述:输入:阶次,3; 控制顶点:4个,(x0,y0),…,(x3,y3) begin x=x0 y=y0 moveto (x,y) for t ﹦0 to 1 step ∆tx ﹦B0,3(t)x0﹢B1,3(t)x1﹢B2,3(t)x2﹢B3,3(t)x3 y ﹦B0,3(t)y0﹢B1,3(t)y1﹢B2,3(t)y2﹢B3,3(t)y3 lineto (x,y) endfor end三次Bezier 曲线例子:对于平面上给定的7个控制点坐标分别为:A (100,300),B (120,200),C (220,200),D (270,100),E (370,100), F (420,200),G (420,300)。
画出其三次Bezier 曲线。
通过以上的准备我们开始编写主函数,再输入T 的实验数据,生成图像。
五、实验程序及运行结果实验程序代码如下// sy1.cpp : Defines the entry point for the application. #include "stdafx.h" #include "resource.h"#define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst;// current instance TCHAR szTitle[MAX_LOADSTRING];TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar textATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK W ndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK A bout(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){MSG msg;HACCEL hAccelTable;LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_SY1, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SY1);while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SY1);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = (LPCSTR)IDC_SY1;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){HWND hWnd;hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent,i;PAINTSTRUCT ps;HDC hdc;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);float p(int point0,int point1,int point2,int point3 ,float t);switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);switch (wmId){case IDM_ABOUT:DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: Add any drawing code here...RECT rt;GetClientRect(hWnd, &rt);//DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);for(i=0;i<1000;i++){SetPixel(hdc,800-Pt(237,237,237,237,0.001*i),680-Pt(620,620,120,120,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(237,237,226,143,0.001*i),680-Pt(120,35 ,24 ,19 ,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(143,143,143,143,0.001*i),680-Pt(19 ,19,0,0,0.001*i),RGB(250,0,0));SetPixel(hdc,800-Pt(143,143,435,435,0.001*i),680-Pt( 0, 0, 0, 0,0.001*i),RGB(250,0,0));SetPixel(hdc,800-Pt(435,435,435,435,0.001*i),680-Pt( 0, 0,19,19,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(435,353,339,339,0.001*i),680-Pt(19,23,36,109,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(339,339,339,339,0.001*i),680-Pt(109,108,620,620,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(339,507,529,552,0.001*i),680-Pt(620,620,602,492,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(552,552,576,576,0.001*i),680-Pt(492,492,492,492,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(576,576,570,570,0.001*i),680-Pt(492,492,662,662,0.001*i),RGB(250,0,0));SetPixel(hdc,800-Pt(570,570,6,6,0.001*i),680-Pt(662,662,662,662,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(6,6,0,0,0.001*i),680-Pt(662,662,492,492,0.001*i),RGB(250,0,0));SetPixel(hdc,800-Pt(0,0,24,24,0.001*i),680-Pt(492,492,492,492,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(24,48,71,183,0.001*i),680-Pt(492,602,620,620,0.001*i),RGB(250,0,0)); SetPixel(hdc,800-Pt(183,183,237,237,0.001*i),680-Pt(620,620,620,620,0.001*i),RGB(250,0,0));}EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;}float p(int point0,int point1,int point2,int point3 ,float t){float pp;pp= point0* (1 - t) * (1 - t) * (1 - t) + point1* 3 * t * (1 - t) * (1 - t) + point2 * 3 * (t * t) * (1 - t) + point3 * (t * t * t);return pp;}若要得到5字,只需改for循环那部分:for(i=0;i<1000;i++){SetPixel(hdc,500-Pt(-149,-149,-149,-345,0.001*i),700-Pt(597,597,597,597,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-345,-365,-365,-368,0.001*i),700-Pt(597,597,599,606,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-368,-406,-368,-406,0.001*i),700-Pt(606,695,606,695,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-406,-397,-406,-397,0.001*i),700-Pt(695,702,695,702,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-397,-382,-372,-351,0.001*i),700-Pt(702,681,676,676,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-351,-351,-351,-142,0.001*i),700-Pt(676,676,676,676,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-142,-33,-142,-33,0.001*i),700-Pt(676,439,676,439,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-33,-32,-32,-32,0.001*i),700-Pt(439,438,436,434,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-32,-32,-35,-44,0.001*i),700-Pt(434,428,426,426,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-44,-74,-109,-149,0.001*i),700-Pt(426,426,420,408,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-149,-269,-324,-324,0.001*i),700-Pt(408,372,310,208,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-324,-324,-264,-185,0.001*i),700-Pt(208,112,37,37,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-185,-165,-149,-119,0.001*i),700-Pt(37,37,44,44,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-119,-86,-65,-42,0.001*i),700-Pt(66,90,99,99,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-42,-14,-0,-0,0.001*i),700-Pt(99,99,87,62,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-0,-0,-46,-121,0.001*i),700-Pt(62,24,0,0,0.001*i),RGB(0,255,0);SetPixel(hdc,500-Pt(-121,-205,-282,-333,0.001*i),700-Pt(0,0,27,78,0.001*i),RGB(0,255,0)); SetPixel(hdc,500-Pt(-333,-378,-399,-399,0.001*i),700-Pt(78,123,180,256,0.001*i),RGB(0,255,0)) ;SetPixel(hdc,500-Pt(-399,-399,-381,-333,0.001*i),700-Pt(256,327,372,422,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-333,-288,-232,-112,0.001*i),700-Pt(422,468,491,512,0.001*i),RGB(0,255,0 ));SetPixel(hdc,500-Pt(-112,-112,-149,-149,0.001*i),700-Pt(512,512,597,597,0.001*i),RGB(0,255,0 ));}运行结果显示为:五、实验总结和体会图形类实验,第一次,也是第一次成功。