迭代法求两点边值问题课程设计分解

时间:2019-05-12 06:58:00下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《迭代法求两点边值问题课程设计分解》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《迭代法求两点边值问题课程设计分解》。

第一篇:迭代法求两点边值问题课程设计分解

基于java实现电子时钟

迭代法求两点边值问题

(一)摘要

当今的环境下,数值计算越来越依赖于计算机。大规模科学计算和工程技术中许多问题的解决,最终归结为大型稀疏线性方程组的求解,其求解时间在整个问题求解时间中占有很大的比重,有的甚至达到80%。由于现今科学研究和大型项目中各种复杂的可以对计算精度和计算速度的要求越来越高。因此,作为大规模科学计算基础的线性代数方程组的高效数值求解引起了人们的普遍关注。这种方程组的求解一般采用迭代法。这次我做的迭代法求两点边值问题就是通过MATLAB来实现的。

关于迭代法,是有很多种解决公式的:Jacobi,G-S和超松弛迭代法。这三种方法的原理大致相同,jacobi需要给定初向量,G-S则需要给定初值,超松弛法是对Guass-Seidel迭代法的加权平均改造。而本文则是对大型稀疏线性方程组迭代求解与三种迭代法(Jacobi,Gauss-Seidel和超松弛迭代法)的收敛速度与精确解的误差比较做出研究。

关键词:数值计算 迭代法 三种公式

基于java实现电子时钟

ITERATION METHOD FOR TWO-POINT BOUNDARY

VALUE PROBLEMS

ABSTRACT

Today's environment, numerical computation is more and more dependent on the computer.Many problems in the large-scale scientific computing and engineering solution, ultimately comes down to solving large sparse system of linear equations, the solution time occupies a large proportion in the whole problem solving time, some even reached 80%.Due to the current scientific research and large projects in various complex can claim to the computing precision and computing speed is higher and higher.Therefore, the linear algebraic equations, which is the basis for large-scale scientific computing efficient numerical solution has attracted widespread attention.To solve the general iterative method is used to this kind of equations.This time I do the iteration method of two-point boundary value problem is accomplished by MATLAB.About the iteration method, there are many kinds of solution formula is: Jacobi, GS requires the given initial value, a super relaxation method is weighted average of the transformation of Gauss’Seidel and over relaxation iteration method)the error between the convergence speed and the exact solution of comparative research.Key words: numerical calculation iterative method three kinds of formula

基于java实现电子时钟

目 录 课程目的与要求……………………………………………………………………………1 1、1课程目标……………………………………………………………………………1 1、2 课程的实现环境……………………………………………………………………1 2 概要设计……………………………………………………………………………………2 3 详细设计……………………………………………………………………………………5 4 测试结果与心得体会………………………………………………………………………8 5 参考文献…………………………………………………………………………………15 附录…………………………………………………………………………………………16 源程序代码…………………………………………………………………………………16

基于java实现电子时钟 课程的目的与要求 1、1课程目标

利用我们所学的数值分析的迭代法知识对线性方程组的问题进行求解,同时把迭代法的求解过程用MATLAB程序语言实现其算法功能。

对实验结果进行记录,对比与分析最后得出结论。1、2课程的实现环境

硬件要求能运行Windows 9.X操作系统的微机系统、Matlab软件。

基于java实现电子时钟

Eps=0.1 结果:

迭代次数k:4394 结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)

共 23 页 第 11 页

基于java实现电子时钟

Eps=0.01 结果:

迭代次数k:379 结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)

超松弛法:代码见附录 Eps=1 w=1.56

共 23 页 第 12 页

基于java实现电子时钟

结果:

迭代次数k:3503 结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)

Eps=0.1 w=1.56 结果:

迭代次数k:1369 结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)

共 23 页 第 13 页

基于java实现电子时钟

Eps=0.01 w=1.56 结果:

迭代次数k:131 结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)4、2三种方法的比较

共 23 页 第 14 页

基于java实现电子时钟

Jacobi、G-S、超松弛法,三者都能够取得对精确解的良好逼近,但是,在相同的精度条件下,三者的收敛速度是不一样的,jacobi

本次数值方法的题目是迭代法求两点边值问题。首先回去温习了数值方法的理论知识,把迭代法的原理弄清楚了,请教老师,上网查资料,忙的不亦乐乎。在设计的过程中我遇到的很多问题,在老师的帮助和自己的思考下还是很好的完成了。

事情就是如此,努力代表收获。这次课程设计,平时感觉挺简单的那些枯燥单调的代码和数学公式,真正到了自己运用的时候却无从下手,但是,解决问题的过程恰是不断学习的过程:数学算法转换为代码的过程要对题目有深入的了解,然后对程序函数定义还要有一定的掌握能力,通过这个的过程让我巩固了自己的数学知识,对数学专业知识和MATLAB的操作有了更深的体会。

课程设计中遇到的问题只凭自己苦思冥想是不能全部解决的,这是同学老师的建议和网络给了我很大的帮助。遇到自己解决不了的问题时,多多向老师同学请教,或许问题就能迎刃而解。另外,生在这个信息化社会,互联网的作用不言而喻,许多问题只要在网上搜索一下就能得到令人满意的解答。

参考文献

[1] 王建卫.MATLAB 7.X 程序设计.北京:中国水利水电出版社,2007.

[2] 李庆扬,王能超,易大义.数值分析[M] .武汉:华中科技大学出版社,2006.7. [3] 清华大学、北京大学计算方法编写组.计算方法[M] .北京:科学出版社,1980.

共 23 页 第 15 页

基于java实现电子时钟

附录

源程序代码:

Jacobi:

function [y,k]=jacobi2(a,eps,h,delta)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;for i=1:n-1 for j=1:n-1 A(i,j)=0;end end

for i=1:n-1 A(i,i)=-(2*eps+h);end

for i=1:n-1 for j=1:n-1 if i==j+1 A(i,j)=eps;end

if i==j-1 A(i,j)=eps+h;end

end end

b=zeros(n-1,1);for i=1:n-2 b(i,1)=a*h^2;end

b(n-1,1)=a*h^2-eps-h;D=zeros(n-1);for i=1:n-1 D(i,i)=A(i,i);end

L=zeros(n-1);for i=1:n-1 for j=1:n-1 if i>j L(i,j)=-A(i,j);end

end

第 16 页

共 23 页

基于java实现电子时钟

end

U=zeros(n-1);for i=1:n-1 for j=1:n-1 if i

end end

B=D(L+U);g=Db;while 1 z=B*y+g;if norm(z-y,inf)

y=z;k=k+1;end

x=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);hold on;grid hold on;plot(y,'b')

G-S: function [y,k]=gs2(a,eps,h,delta)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;for i=1:n-1 for j=1:n-1 A(i,j)=0;end

共 23 页 第 17 页

基于java实现电子时钟

end

for i=1:n-1 A(i,i)=-(2*eps+h);end

for i=1:n-1 for j=1:n-1 if i==j+1 A(i,j)=eps;end

if i==j-1 A(i,j)=eps+h;end

end end

b=zeros(n-1,1);for i=1:n-2 b(i,1)=a*h^2;end

b(n-1,1)=a*h^2-eps-h;D=zeros(n-1);for i=1:n-1 D(i,i)=A(i,i);end

L=zeros(n-1);for i=1:n-1 for j=1:n-1 if i>j L(i,j)=-A(i,j);end

end end

U=zeros(n-1);for i=1:n-1 for j=1:n-1 if i

end end

B=D(L+U);g=Db;while 1 z=(D-L)U*y+(D-L)b;if norm(z-y,inf)

第 18 页

共 23 页

基于java实现电子时钟

end

y=z;k=k+1;end

x=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);hold on;grid hold on;plot(y,'b')

超松弛:

function [y,k]=sor(a,eps,h,delta,w)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;for i=1:n-1 for j=1:n-1 A(i,j)=0;end end

for i=1:n-1 A(i,i)=-(2*eps+h);end

for i=1:n-1 for j=1:n-1 if i==j+1 A(i,j)=eps;end

if i==j-1 A(i,j)=eps+h;end

end end

b=zeros(n-1,1);for i=1:n-2 b(i,1)=a*h^2;end

共 23 页 第 19 页

基于java实现电子时钟

b(n-1,1)=a*h^2-eps-h;D=zeros(n-1);for i=1:n-1 D(i,i)=A(i,i);end

L=zeros(n-1);for i=1:n-1 for j=1:n-1 if i>j L(i,j)=-A(i,j);end

end end

U=zeros(n-1);for i=1:n-1 for j=1:n-1 if i

end end

B=D(L+U);g=Db;Lw=((D-w*L)^-1)*((1-w)*D+w*U);while 1 z=Lw*y+w*(D-w*L)^-1*b;if norm(z-y,inf)

y=z;k=k+1;end

x=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);hold on;grid hold on;plot(y,'b')

共 23 页 第 20 页

第二篇:两点边值问题地有限差分法偏微分方程数值解课程实验报告

实验课程名称

偏微分方程数值解

开课实验室

数统学院

数统

年级

2013 专业班

信计 2 2 班

2015 至

2016 学年第2

学期

成绩

教师签名

数学与统计学院制

开课学院、实验室:

数统学院

实验时间

:2016 年

实验项目

两点边值问题的有限差分法

实验项目类型

验证

演示

综合设计

其他

指导教师

曾芳

成绩

一.实验目的通过该实验,要求学生掌握求解两点问题的有限差分法,并能通过计算机语言编程实现。

二.实验容

考虑如下的初值问题:

            , ,du x du x dLu p x r x q x u x f x x a bdx dx dx        

(1)    , u a u b    

(2)其中    1, p x C a b ,        , , , r x q x f x C a b , min0 p x p  ,  0 q x ,,   是给定常数。

将区间 N 等分,设b ahN,网点 , 0,1,...,ix a ih i N   。

1.在第三部分写出问题(1)和(2)的差分格式,并给出该格式的局部截断误差。

2.根据你写出的差分格式,编写一个有限差分法程序。将所写程序放到第四部分。

3.给定参数 0, 1 a b  ,3, 1, 2 p r q   ,0  ,1  ,问题(1)的精确解  2 1 xu x x e,其 中 将  2 1 xu x x e 及 1, 2, 3    p r q 带 入 方 程(1)可 得   f x。

分 别 取10,20,40,80,160 N ,用所编写的程序计算问题(1)和(2)。将数值解记为iu,1,..., 1 i N  ,网点处精确解记为   i u,1,..., 1 i N  。然后计算相应的误差

 0maxNiici Ne u u  , 1201NNiiie h u u 及收敛阶 2lnln2N Ne e,将计算结果填入第五部分的表格,并对表格中的结果进行解释? 4.将数值解和精确解画图显示,每种网格上的解画在一图。

三.实验原理、方法(算法)、步骤

1.差分格式:

错误!未找到引用源。= =--1/h^2(错误!未找到引用源。--((错误!未找到引用源。))错误!未找到引用源。+ +错误!未找到引用源。)+错误!未找到引用源。((错误!未找到引用源。)/2h+错误!未找到引用源。= =错误!未找到引用源。

错误!未找到引用源。

A,错误!未找到引用源。

2.局部阶段误差:

错误!未找到引用源。

(u)=O(h^2)

3.程序

clear all

N=10;

a=0;b=1;

p=(x)1;

r=(x)2;

q=(x)3;

alpha=0;beta=1;

f=(x)(4*x^2-2)*exp(x-1);

h=(b-a)/N;

H=zeros(N-1,N-1);g=zeros(N-1,1);%

for i=1

H(i,i)=2*(p(a+(i+1/2)*h)+p(a+(i-1/2)*h))/h+2*h*q(a+i*h);

H(i,i+1)=-(2*p(a+(i+1/2)*h)/h-r(a+i*h));

g(i)=2*h*f(a+i*h)+(2*p(a+(i-1/2)*h)/h+r(a+i*h))*alpha;

end

for i=2:N-2

H(i,i-1)=-(2*p(a+(i-1/2)*h)/h+r(a+i*h));

H(i,i)=2*(p(a+(i+1/2)*h)+p(a+(i-1/2)*h))/h+2*h*q(a+i*h);

H(i,i+1)=-(2*p(a+(i+1/2)*h)/h-r(a+i*h));

g(i)=2*h*f(a+i*h);

end

for i=N-1

H(i,i-1)=-(2*p(a+(i-1/2)*h)/h+r(a+i*h));

H(i,i)=2*(p(a+(i+1/2)*h)+p(a+(i-1/2)*h))/h+2*h*q(a+i*h);

g(i)=2*h*f(a+i*h)+(2*p(a+(i+1/2)*h)/h-r(a+i*h))*beta;

end

u=Hg;

u=[alpha;u;beta];

x=a:h:b;

y=(x.^2).*exp(x-1);

plot(x,u);

hold on

plot(x,y);

y=y"

z=y-u

四.实验环境(所用软件、硬件等)及实验数据文件

Matlab

五.实验结果及实例分析

N Nce

收敛阶 0Ne

收敛阶 10 0.00104256 …… 0.00073524 …… 20 0.00026168 1.9341 0.00018348 1.4530 40 0.00006541 2.0001 0.00004585 2.0000 80 0.00001636 1.9993 0.00001146 2.0000 160 0.00000409 2.0000 0.00000287 2.0000

N N 越大

只会使绝对误差变小,方法没变,所以收敛阶一致。

图示为:((绿线为解析解,蓝线为计算解))

N=10

N=20

N=40

N=80

N=160

教师签名

****年**月**日

第三篇:某水电站继电保护课程设计分解

电力系统继电保护课程设计说明书 引 言

1.1 摘要

由于大型水电站的母线、发电机和变压器的结构比较复杂,在运行过程中都可能会发生各种各样的故障和异常运行状态,为了确保在保护范围内发生故障,都能有选择性的快速切除故障,需要配置多种继电保护装置,必要时进行多重化配置,从而将水电站中重要设备的危害和损失降到最小,对电力系统的影响最小。

发电机是电力系统中的中的一个重要组成部件,发电机的安全运行对保证电力系统的正常工作和电能质量起着决定性的作用。所以,继电保护装置对大型水电站的正常运行起着至关重要的作用。

通过本课程设计,使学生掌握和应用电力系统继电保护的设计、整定计算、资料整理查询和电气绘图等使用方法。在此过程中培养学生对各门专业课程整体观的综合能力,通过较为完整的工程实践基本训练,为全面提高学生的综合素质及增强工作适应能力打下一定的基础。本课程主要设计发电机继电保护的原理、配置及整定计算,给今后继电保护的工作打下良好的基础。1.2 原始资料

某水电站(如下图 1)所示:

图 1 水电站系统图

电力系统继电保护课程设计说明书 发电机继电保护

在电力系统中,发电机是一个尤其重要的电器元件,决定着电力系统的正常工作与电能质量。同时,发电机本身价格昂贵,因此,必须装设性能完善的继电保护装置,用于针对发电机各种故障和不正常运行状态。4.1 故障分析 4.1.1故障类型

(1)定子绕组相间短路:危害最大;

(2)定子绕组一相的匝间短路:可能演变为单相接地短路和相间短路;(3)定子绕组单相接地:较常见,烧坏铁芯或造成局部融化;(4)转子绕组一点接地或两点接地:一点接地时危害不严重;两点接地时,因破坏了转子磁通的平衡,可能引起发电机的强烈震动或烧损转子绕组;

(5)转子励磁回路励磁电流急剧下降或消失:从系统吸收无功功率,造成失步,从而引起系统电压下降,甚至可使系统崩溃。4.1.2不正常运行状态

(1)外部短路引起的定子绕组过电流:温度升高,绝缘老化;

(2)负荷等超过发电机额定容量而引起的三相对称过负荷:温度升高,绝缘老化;

(3)外部不对称短路或不对称负荷而引起的发电机负序过电流和过负荷:在转子中感应出100Hz的倍频电流,可使转子局部灼伤或使护环受热松脱,对发电机造成重大损害。

(4)突然甩负荷引起的定子绕组过电压:调速系统惯性较大发电机,在突然甩负荷时,可能出现过电压,造成发电机绕组绝缘击穿。

(5)励磁回路故障或强励时间过长而引起的转子绕组过负荷;(6)汽轮机主气门突然关闭而引起的发电机逆功率:发电机不发出有功功率而从系统中吸收有功功率,造成发电机转为电动机运行,原因调速控制回路故障、机炉保护动作或某些认为因素。

第 9 页

共 17 页

电力系统继电保护课程设计说明书

4.1.3保护类型

1.发电机纵差动保护:定子绕组及其引出线的相间短路保护;

2.横差动保护:定子绕组一相匝间短路的保护;

3.单相接地保护:对发电机定子绕组单相接地短路的保护;

4.发电机的失磁保护:针对转子励磁回路励磁电流急剧下降或消失设置的保护;

5.过电流保护:反应外部短路引起的过电流,同时作为纵差动保护的后备保护;

6.负序电流保护:反应不对称短路或三相负荷不对称时,发电机定子绕组中出现的负序电流;

7.过负荷保护:发电机长时间超负荷运行时,作用于信号的保护; 8.过电压保护:反应突然甩负荷而出现的过电压; 9.转子一点接地保护和两点接地保护:励磁回路的接地故障保护; 10.转子过负荷保护;

11.逆功率保护:汽轮机主汽门误关闭同时发电机出口断路器未跳闸,发电机失去原动力,从发电机运行转为电动机运行,从电力系统中吸收有功功率。危害:汽轮机尾部叶片有可能过热而造成事故。

本发电厂发电机保护装置的设置可依据以上原则并结合小型水电站情况进行,对发电机发电机比率制动式纵差保护和定子匝间短路保护进行整定计算。4.2 发电机比率制动式纵差保护(主保护)原理及其整定计算 4.2.1 比率制动式差动保护原理

比率制动式纵差保护仅反应相间短路故障。具有比率制动特性的差动保护的二次接线如图1.2所示。图中,KVI串接于三相电流互感器的中性线上,反应中性线上的电流大小,作为差动保护TA断线监视用,延时发信号。

当差动线圈匝数Wd与制动线圈匝数Wres的关系为Wres=1/2Wd时,第 10 页

共 17 页

电力系统继电保护课程设计说明书

it1iId,横坐标为制动电流Ires。

为了正确进行整定计算,首先应了解纵差保护的不平衡电流与负荷电流和外部短路电流间的关系。

第 11 页

共 17 页 n1

图1.2具有比率制动特性的差动保护的二次接线 差动电流:

制动电流:

比率制动式差动保护的动作方程为:

IdK(IresIres.min)Id.min,IresIres.min

IdId.min,IresIres.min 式中:,—— 一次电流;

,—— 二次电流;

na —— 电流互感器变比。Id—— 差动电流或称动作电流 Ires—— 制动电流 Ires.min—— 拐点电流

Id.min——启动电流 K—— 制动斜率

差动保护的制动特性如图1.2.1中的折线ABC所示。图中,纵坐标为差动电流

电力系统继电保护课程设计说明书

发电机纵差保护用的10P级电流互感器,在额定一次电流和额定二次负荷条件下的比误差为±3%。因此,纵差保护在正常负荷状态下的最大不平衡电流不大于6%。但随着外部短路电流的增大和非周期暂态电流的影响,电流互感器饱和,不平衡电流将急剧增大,实际的不平衡电流与短路电流的关系曲线如图1.2.1中的曲线OED所示。

根据比率式制动特性曲线分析。当发电机正常运行时,或区外较远的地方发生短路时,差动电流接近为零,差动保护不会误动。发电机内部发生短路故障时,差动电流明显增大,图1.4 比率制动式差动保护的制动特性

I1和I2 相位接近相同,减小了制动量,从而可灵敏动作。当发生发电机内部轻微故障时,虽然有负荷电流制动,但制动电流比较小,保护一般也能可靠动作。4.2.2 比率制动式差动保护的整定计算

1、启动电流Id.min的整定:

Id.minKrel(Ier1Ier2)

式中Krel——可靠系数,取1.5 ~ 2 Ier1——保护两侧的TA变比误差产生的差流,取0.06Ign(Ign为发电机额定电流);

Ier2——保护两侧的二次电流误差(包括二次回路引线差异以及纵差动保护输入通道变换系数调整不一致)产生的差流,取0.1Ign。

所以:Id.min(0.24~0.32)Ign,通常取0.3Ign。

第 12 页

共 17 页

电力系统继电保护课程设计说明书

所以: Id.min0.3Ign=0.3*4.23=1.269(A)

2、拐点电流Ires.min的整定:

Ires.min(0.5~1.0)Ign(2.115~4.3)A

3、比率制动特性的制动系数Kres和制动斜率K的整定。

发电机纵差动保护比率制动特性的制动斜率K,决定于夹角。可以看出,当拐点电流确定后,夹角决定于C点。而特性曲线上的C点又可近似由发电机外部故障时最大短路电流Ik.max与差动回路中的最大不平衡电流Iunb.max确定。由此制动系数Kres可以表示为:

KresIunb.max Ik.max而制动线斜率K则可表示为: KIunb.maxId.min

Ik.maxIres.min差动回路中的最大不平衡电流,除与纵差动保护用两侧TA的10%误差、二次回路参数差异及差动保护测量误差有关外,尚与纵差动保护两侧TA暂态特性有关。因此故障时,为躲开最大不平衡电流,C点电流应取为:

Id.maxKrel(0.10.1Kf)Ik.max 式中 Krel——可靠系数,取1.3 ~ 1.5;

Kf——暂态特性系数,相同时取0,不同时取0.05~0.1;

Id.max——最大动作电流。

于是可得Id.max(0.26~0.45)Ik.max。令Id.m可得Kres(0.26~0.45)。xa=Iunb.max,Kres可取0.3;Kres因此,对于发电机完全纵差动保护,而对不完全纵差动保护,可取0.3~0.4。而对制动斜率K可以根据公式KIunb.maxId.min求得。

Ik.maxIres.min第 13 页

共 17 页

电力系统继电保护课程设计说明书

4.3 发电机定子匝间短路保护(横差保护)原理及整定计算

发电机定子匝间短路保护原理,主要有发电机纵向零序过电压及故障分量负序方向型匝间保护,不仅作为发电机内部匝间短路的主保护,还可作为发电机内部相间短路及定子绕组开焊的保护;故障分量负序方向(ΔP2)保护应装在发电机端,不仅可作为发电机内部匝间短路的主保护,还可作为发电机内部相间短路及定子绕组开焊的保护;高灵敏零序电流型横差保护,作为发电机内部匝间、相间短路及定子绕组开焊的主保护。

发电机横差保护,是发电机定子绕组匝间短路(同分支匝间短路及同相不同分支之间的匝间短路)、线棒开焊的主保护,也能保护定子绕组相间短路。

单元件横差保护,适用于每相定子绕组为多分支,且有两个或两个以上中性点引出的发电机。

发电机单元件横差保护的输入电流,为发电机两个中性点连线上的TA 二次电流。以定子绕组每相两分支的发电机为例,其交流输入回路示意图如下所示:

理想发电机正常时中性点连线上不会有电流产生,实际上发电机不同中性点之间从在不平衡电流,原因如下:(1)定子同向而不同分支的绕组参数不完全相同,致使两端的电动势及支路电流有差异。

(2)发电机定子气息磁场不完全均匀,在不同定子绕组中产生的感应电动势不同。

(3)转自偏心,在不同的定子绕组中产生不同电动势。(4)存在三次谐波。

因此单原件纵差保护动作电流必须克服这些不平衡,整定式为:

第 14 页

共 17 页

电力系统继电保护课程设计说明书

Iset(0.250.31)IgN

Iunb1 额定工况下,同相不同分支绕组由于绕组之间参数的差异产生的不平衡电流,由于是三相之和,一般可取5IgN

Iunb2 磁场气隙不平衡产生的不平衡电流,一般可取10IgN Iunb3 转自偏心产生的不平衡电流,一般取10IgN Krel 可靠系数,取1.2—1.5 把各系数代入得Iset(0.250.31)IgN (1.05751.3113)A 4.4 励磁回路两点接地保护

当发电机励磁回路发生两点接地故障时,部分励磁线圈将被短路,由此由于气隙磁势的对称性遭到破坏,可能使转子产生剧烈振动,因此在发电机上需要装设励磁回路两点接地保护,该装置只设一套,并仅在励磁回路中出现稳定性的一点接地时才投入工作。4.5 过负荷保护整定

过负荷保护是动作于信号的保护,考虑到过负荷对称性,该保护只有一相中装设,并与过电流保护共用一组互感器,保护由电流继电器及时间继电器组成。

电流继电器动作值按照下式计算: Idz.jKkINf1.05507.94=5.22A Khnl0.85120Kk

可靠系数,取=1.05;

Kh

返回系数,取=0.85; Inf

发电机额定电流;

nl

电流互感器变比;

过负荷保护动作时限比过电流保护长,一般为9~10s.第 15 页

共 17 页

电力系统继电保护课程设计说明书

本次课程设计主要针对某水电站电力系统对其进行短路电流的计算,对发电机继电保护进行设计。在这些设计过程中需要用到各种电力工程设计手册,并且借用AutoCAD辅助工具画出其各类电气接线图。

在完成本次课程设计的过程中,运用了大量的专业知识,也进行了大量的计算。而在此过程中也将自己专业知识不扎实,计算能力不强的缺点暴露无遗。在完成课设期间得到了同学的大力帮助,在此衷心的表示感谢。通过对该小型水电站电气部分继电保护的设计,使我对继电保护系统有了进一步的掌握,在此过程中,使我了解并一定程度掌握了专业知识在实际工程中的应用,通过该设计也使我学会了在电气设计中如何正确的查询相关规程规范。

第 16 页

共 17 页

电力系统继电保护课程设计说明书

参 考 文 献

[1]水利电力部东北电力设计院 编,电力工程设计手册,上海:上海科学技术出版社,1981年9月

[2]卓乐友 编,电力工程电气设计手册电气二次部分,北京:水利电力出版社1990年9月

[3]水利电力部华东电力设计院 主编,电力工程概算指标,北京:水利电力出版社,1987年8月

[4]孟祥萍 高燕 编,电力系统分析,北京:高等教育出版社,2004年2月

[5]何永华 主编,发电厂及变电站的二次回路,北京:中国电力出版社,2004年3月

[6]商国才 编,电力系统自动化,天津:天津大学出版社,1999年6月

[7]孙国凯 霍利民 柴玉华 主编,电力系统继电保护原理,北京:中国水利水电出版社,2002年1月

[8]熊信银 张支涵 主编,电力系统工程基础,武汉:华中科技大学出版社,1997年

第 17 页

共 17 页

第四篇:通信原理课程设计详细步骤分解09

通信原理课程设计详细步骤分解

一、语音信号频带传输通信系统仿真

1、调用模块产生模拟正弦信号;调出示波器观察是否符合要求。

2、对模拟信号进行采样、量化、编码,PCM或DPCM编码;用示波器观察中间过程。

3、将编码后的信号与载波相乘得到ASK已调信号,或控制压控振荡器产生FSK信号,或者变为双极性信号后再与载波相乘得到PSK,或者先差分编码再与载波相乘得到DPSK信号;用示波器观察中间过程。

4、对信号进行相干解调,将他们与原载波信号进行乘法后再低通滤波即可;

5、解调后的信号再进行PCM或DPCM解码,还原出原信号(做出此步论文合格即可及格);用示波器观察中间过程。

6、成功后再在信道中加入高斯白噪声,用示波器观察中间过程(做出此步论文合格即可达到中);

7、成功后再把信源改成自己录入的语音信号。用示波器观察中间过程。(做出此步论文合格可以达到良或优)。

二、语音信号基带传输通信系统仿真

1、调用模块产生模拟正弦信号;用示波器观察中间过程

2、对模拟信号进行采样、量化、编码,PCM或DPCM编码;用示波器观察中间过程。

3、将编码后的信号调用通信模块库中的模块再进行纠错编码;用示波器观察中间过程。

4、对信号通过二进制对称信道;用示波器观察中间过程。

5、再进行纠错解码;用示波器观察中间过程。

6、解码后的信号再进行PCM或DPCM解码,还原出原信号(做出此步论文合格即可及格);

7、改变信道误码率,计算解码后的误码率,并绘制误码率曲线(做出此步论文合格即可达到中);

8、成功后再把信号源改成自己录入的语音信号(做出此步论文合格可以达到良或以上)。

三、CDMA直接扩频通信系统仿真

1、调用模块产生随机分布的二进制信号,转换为双极性;调出示波器观察是否符合要求。并观察其功率谱密度。

2、调用模块产生题目要求的扩频码,转换为双极性;用示波器观察中间过程。注意扩频码的频率应为信源频率的整数倍。

3、将二进制信号与扩频码相乘得到已扩信号,再与高频载波相乘得到扩频已调信号;用示波器观察中间过程。并观察功率谱密度。

4、对信号进行相干解调,将他们与原载波信号进行乘法后再低通滤波即可;注意用示波器观察输出,尤其需要观察滤波引起的时延。

5、解调后的信号再与原扩频码相乘进行解扩,还原出原信号(做出此步论文合格即可及格);用示波器观察中间过程。并观察功率谱密度

6、成功后再在信道中加入高斯白噪声,用示波器观察中间过程(做出此步论文合格即可达到中);

7、成功后再把信源改成自己录入的语音信号,修改对应参数。用示波器观察中间过程。(做出此步论文合格可以达到良或优)。

第五篇:计算机图形学课程设计 图形绘制变换分解

计算机图形学 实验报告

课程名称 : 计算机图形学 实验名称 : 图形绘制与变换 学 院 : 电子信息工程学院 专 业 : 计算机科学与技术 班 级 : 11计科本 01班 学 号 : 111102020103 姓 名 : 张慧 指导教师 : 王征风

二零一四年

目录

一、引言----------------3

二、设计需求---------3

2.1 设计目标--3 2.2 设计环境--3

2.2.1 VC++6.0------------------------3 2.2.2 MFC------------------------------4 2.3 设计题目及要求----------------------4 2.4 总体流程图----------------------------4

三、课程设计原理---5

3.1 实现的算法------------------------------5

3.1.2 Bresenham算法画直线------5 3.1.3 中心点算法画圆和椭圆------5 3.2 图形变换的基本原理------------------7

3.2.1平移变换------------------------7 3.2.2 旋转变换----------------------8 3.2.3 比例变换----------------------8

四、总体设计与功能实现-------------------------8

4.1 主要界面设计---------------------------8 4.2 设置颜色界面---------------------------8

4.2.1 界面设置代码------------------8 4.2.2 运行结果------------------------9 4.3 二维线画图元实现---------------------9 4.4 画多边形功能的实现--------------13 4.5 画Bezier曲线功能的实现-------14 4.6 二维图形变换的实现--------------16 4.7 三维图形的变换--------------------17

五、实验心得体会

一、引言

计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。

计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的OpenGL程序效果。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。

通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。

二、设计需求

2.1 设计目标

以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。

2.2 设计环境

2.2.1 VC++6.0 VC++6.0是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架,而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++提供的 高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变 得简单。2.2.2 MFC MFC(Microsoft Foundation Classes),是 一 个 微 软 公 司 提 供 的 类 库(class libraries)以 C++类的形式封装了 Windows 的 API,它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组 件的封装类。MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所 有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。

2.3 设计题目及要求

(1)题目:实现多边形和曲线的绘制和变换

(2)要求:学会使用VC++编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换.2.4 总体流程图

三、课程设计原理

3.1 实现的算法

3.1.1 DDA算法画直线

DDA是数字微分分析式(Digital Differential Analyzer)的缩写。

已知直线两端点(x1,y1)、(x2,y2)则斜率m为:m =(y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式: xi+1=xi+Dx yi+1=yi+Dy。

递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体算法是: 该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)=-9;Integer(8.5)=8;Sign(i),根据i的正负,分别得到-1,0,+1; 相应代码:

//DDA DrawLine

{if(abs(x2-x1)> abs(y2-y1))

length = abs(x2-x1);

else

length = abs(y2-y1);

Dx =(x2-x1)/length;

Dy =(y2-y1)/length;

x = x1+0.5*Sign(Dx);

y = x2 + 0.5*Sign(Dy);

i = 1;

while(i <= lenght)

{ setpixel(Integer(x),Integer(y),color);

x= x + Dx;

y= y + Dy;

i+=1;} } 3.1.2 Bresenham算法画直线

思路如下: // 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).// 根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1),否则,下个点为B(x1+1,y1),3.画点(U或者B).4.跳回第2步.5.结束.3.1.3中心点算法画圆和椭圆

(1)中心点算法画圆

在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。生成圆弧的中点算 法和上面讲到的生成直线段的中点算法类似。

考虑第一象限内x[0,R/2]的八分之一圆弧段。经过计算,得出判别式的递推公式为:

di1di2xi3di2(xiyi)5d0d0

(xi, M SE yi,r)E 这两个递推公式的初值条件为:

(x0,y0,r)(0,R)d05/4R

编写成员函数如下:

void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color){ double x,y,d,xP,yP,squarea,squareb;

squarea=a*a;

squareb=b*b;

xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));

yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb)));

x=0;

y=b;

d=4*(squareb-squarea*b)+squarea;

pDC->SetPixel(x,y,color);

while(x<=xP)

{if(d<=0)d+=4*squareb*(2*x+3);

else

{d+=4*squareb*(2*x+3)-8*squarea*(y-1);

y--;}

x++;

pDC->SetPixel(x,y,color);}

x=a;

y=0;

d=4*(squarea-a*squareb)+squareb;

pDC->SetPixel(x,y,color);

while(y

{ if(d<=0)d+=4*squarea*(2*y+3);

else

{d+=4*squarea*(2*y+3)-8*squareb*(x-1);

x--;}

y++;

pDC->SetPixel(x,y,color);}} 编写OnDraw函数如下:

void CMy2_9View::OnDraw(CDC* pDC){CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心点算法画椭圆

我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有X轴对称、Y轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x,-y)、(-x, y)和(-x,-y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。

相应代码:

void MP_Ellipse(int xc , int yc , int a, int b){ double sqa = a * a;double sqb = b * b;double d = sqb + sqa *(-b + 0.25);int x = 0;int y = b;EllipsePlot(xc, yc, x, y);while(sqb *(x + 1)< sqa *(y1))* 2-(a * b)* 2;while(y > 0){if(d < 0){ d += sqb *(2 * x + 2)+ sqa *(-2 * y + 3);x++;} else

{d += sqa *(-2 * y + 3);} y--;EllipsePlot(xc, yc, x, y);}} 3.2 图形变换的基本原理

3.2.1平移变换

平移变换函数如下:

void glTranslate{fd}(TYPE x, TYPE y, TYPE z); 三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。

3.2.2 旋转变换

旋转变换函数如下:

Void glRota{fd}TYPE angle, TYPE x, TYPE y, TYPE z);

函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。3.2.3 比例变换

比例变换函数如下:

Void glScale{fd}(TYPE x, TYPE y, TYPE z);

单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若x小于1.0,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。

四、总体设计与功能实现

4.1 主要界面设计

4.2 设置颜色界面

4.2.1 界面设置代码:

void CGraphicsView::OnClock(){ WHAT_TO_DO=ID_CLOCK;

clean();int xx = 450, yy = 300, r = 150,d = 5;int i, white = RGB(255,255,255);mile(xx, yy, r, COLOR);Matrix m(xx, 240), s(xx, 200);Matrix t1(xx, yy, true), t2(-xx,-yy, true), mr(PI/1800), sr(PI/30);mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(), d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);

for(i=0;i<120;i++){

::Sleep(80);

mile(m.getx(), m.gety(), d+1, white);mile(s.getx(), s.gety(), d, white);dne(m.getx(), m.gety(), xx, yy, white);dne(s.getx(), s.gety(), xx, yy, white);m = t1*mr*t2*m;s = t1*sr*t2*s;mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(),d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);}} 4.2.2 点击“设置--颜色”后,运行结果如下:

4.3 二维线画图元实现

4.3.1 实现代码:

void CGraphicsView::MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int r,x,y,deltax,deltay,d;r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0));x=0;y=r;deltax=3;deltay=2-r-r;d=1-r;while(x<=y){ ::Sleep(time);

pdc->SetPixel(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,-x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,-x+y0,color);

if(d<0)

{ d+=deltax;

deltax+=2;

x++;}

else

{ d+=deltax+deltay;

deltax+=2;

deltay+=2;

x++;

y--;}}} void CGraphicsView::midellispse(int xx, int yy, int r1, int r2, int color){ } void CGraphicsView::Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color){

xx0=(x2+x1)/2;yy0=(y2+y1)/2;rra=abs(x2-x1)/2;rrb=abs(y2-y1)/2;if(rra==0 && rrb==0)return;Ellipse0(pdc,xx0,yy0,rra,rrb,color);} void CGraphicsView::Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color){

int i,yy;int x,y,deltax,deltay;int aa,aa2,aa3,bb,bb2,bb3;double d1,d2;aa=a*a;aa2=aa*2;aa3=aa*3;bb=b*b;bb2=bb*2;bb3=bb*3;x=0;y=b;d1=bb+aa*(-b+0.25);deltax=bb3;deltay=-aa2*b+aa2;pdc->SetPixelV(x+x0,y+y0,color);pdc->SetPixelV(x+x0,-y+y0,color);while(bb*(x+1)

yy=y;

if(d1<0)

{ d1+=deltax;

deltax+=bb2;

x++;}

else

{

d1+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--;}

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;deltax-=bb;deltay+=aa;while(y>0){ if(d2<0)

{ d2+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--;}

else

{ d2+=deltay;

deltay+=aa2;

y--;}

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color);}} void CGraphicsView::DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx>=0)

s1=1;else

s1=-1;dy=y1-y0;if(dy>=0)

s2=1;else s2=-1;dx=abs(dx);dy=abs(dy);if(dx>=dy){

s=0;

di=(int)dx;

k=dy/dx*s2;} else { s=1;

di=(int)dy;

k=dx/dy*s1;} x=x0;y=y0;for(int i=0;i<=di;i++){if(s==0)

{

xx=(int)x;

yy=(int)(y+0.5);

::Sleep(time);

pdc->SetPixel(xx,yy,color);

x+=s1;

y+=k;}

else{

xx=(int)(x+0.5);

yy=(int)y;

::Sleep(time);

pdc->SetPixel(xx,yy,color);

y+=s2;

x+=k;}}} 4.3.2 点击二维线画图元,课相应画出直线、圆和椭圆,结果如下:

4.4 画多边形功能的实现

4.4.1 部分实现代码:

void CGraphicsView::OnDrawDuoBX(){ Vertex_Count dlg;if(dlg.DoModal()==IDOK){ if(dlg.m_vertex_count>MAX)

{ MessageBox(“输入顶点数过大”);

return;}

VertexTotal=dlg.m_vertex_count;

CDC *pDC=GetDC();

CPen pen(PS_SOLID,2,RGB(255,255,255));

CPen *pOldpen=pDC->SelectObject(&pen);

pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

int i;

for(i=1;i

pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5));

pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

pDC->SelectObject(pOldpen);

ReleaseDC(pDC);

inLength=0;

outLength=0;

WHAT_TO_DO=ID_DrawDuoBX;}}

4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下:

4.5 画Bezier曲线功能的实现

4.5.1 部分实现代码:

void CGraphicsView::OnBezier(){ // TODO: Add your command handler code here WHAT_TO_DO=ID_BEZIER;CDC *p=GetDC();

p->TextOut(10, 20, “PS:鼠标左键添加曲线,鼠标右键修改曲线.”);

ReleaseDC(p);} void CGraphicsView::OnBezierClear(){ n =-1;RedrawWindow();} void CGraphicsView::DrawBezier(DPOINT *p){ if(n <= 0)return;if((p[n].x < p[0].x+1)&&(p[n].x > p[0].x-1)&&(p[n].y < p[0].y+1)&&(p[n].y > p[0].y-1)){ pDC->SetPixel(p[0].x, p[0].y, COLOR);

return;} DPOINT *p1;p1 = new DPOINT[n+1];int i, j;p1[0] = p[0];for(i=1;i<=n;i++){ for(j=0;j<=n-i;j++)

{ p[j].x =(p[j].x + p[j+1].x)/2;

p[j].y =(p[j].y + p[j+1].y)/2;}

p1[i] = p[0];} DrawBezier(p);DrawBezier(p1);delete p1;} void CGraphicsView::OnBezierAdd(){ AddorMove = 1;} void CGraphicsView::OnBezierMove(){ AddorMove =-1;} void CGraphicsView::OnMouseMove(UINT nFlags, CPoint point){ switch(WHAT_TO_DO){ case ID_BEZIER:

{ if(current >= 0){ points[current].x = point.x;

points[current].y = point.y;

RedrawWindow();} if(current2 >= 0)

{ points[current2].x = point.x;

points[current2].y = point.y;

RedrawWindow();}

break;} default:break;} CView::OnMouseMove(nFlags, point);} 4.5.2 点击曲线--Beizer曲线,可实现Beizer曲线的绘制功能,绘制结果如下图:

图 1 图 2

4.5.3 点击曲线--Beizer曲线,可实现Beizer曲线的移动,鼠标点击其中的任一点,可实现曲线的移动,绘制结果如下图:

上图1移动后的曲线

上图2移动后的曲线 4.6 二维图形变换的实现

可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下: void CGraphicsView::OnXuanzhuan(){ WHAT_TO_DO=ID_XUANZHUAN;

time=0;

OnClear();

CClientDC dc(this);CDC* pDC=&dc;

int i, white=RGB(255,255,255), point [2][2]={{300,200},{300,250}};

Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);

int midx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2;

Matrix t1(midx, midy,true), t2(-midx,-midy,true);

Matrix r(PI/50);

Matrix temp(midx, midy,true);

temp = t1*r*t2;

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);}

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC,a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);}

time=5;} void CGraphicsView::OnUpdateXuanzhuan(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);} void CGraphicsView::OnScale(){ WHAT_TO_DO=ID_SCALE;

OnClear();CClientDC dc(this);CDC* pDC=&dc;

time=0;int i,white=RGB(255,255,255), point[4][2]={{300,250},{400,250},{300,300},{400,300}};float sx=0.9,sy=0.85;int midx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2;Matrix s1(sx,sy),s2(1/sx,1/sy);Matrix t1(midx, midy,true), t2(-midx,-midy,true);

Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);Matrix c(point[2][0],point[2][1]), d(point[3][0],point[3][1]);Matrix temp(midx, midy,true);temp = t1*s1*t2;DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);for(i=0;i<20;i++){

::Sleep(30);

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp = t1*s2*t2;for(i=0;i<20;i++){

::Sleep(30);

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} time=5;} void CGraphicsView::OnUpdateScale(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);} 4.7 三维图形的变换

主要实现三维图形的上下左右平移,分别绕X轴Y轴Z轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变 4.7.1 部分代码如下:

void CGraphicsView::OnAoduomianti(){ WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlg1;dlg1.DoModal();} void CGraphicsView::OnUpdateAoduomianti(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);} void CDrawDLG::OnPaint()

{ CPaintDC dc(this);// device context for painting CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();// CDC *PDC=pWnd->GetDC();Draw();} void CDrawDLG::Draw(){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);D v[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8];

POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8];int z[8];

for(int i=0;i<8;i++){ d[i].x=v[i].x;

d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU));

d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU));

v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU));

v[i].y=d[i].y;

v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU));

d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU));

d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU));

d[i].z=v[i].z;

w[i].x=d[i].x+cx;

w[i].y=d[i].y+cy;

z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3];p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7];

p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4];p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5];p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4];switch(Maxnum(z,7)){ case 0:fill(p0,p2,p5,0,2,5);break;

case 1:fill(p0,p2,p3,0,2,3);break;

case 2:fill(p0,p3,p4,0,3,4);break;

case 3:fill(p0,p4,p5,0,4,5);break;

case 4:fill(p1,p2,p5,1,2,5);break;

case 5:fill(p1,p2,p3,1,2,3);break;

case 6:fill(p1,p3,p4,1,3,4);break;

case 7:fill(p1,p4,p5,1,4,5);break;}} BOOL CDrawDLG::OnInitDialog(){ CDialog::OnInitDialog();m_scroll1.SetScrollRange(-180,180);m_scroll1.SetScrollPos(0);m_scroll2.SetScrollRange(-180,180);m_scroll2.SetScrollPos(0);m_scroll3.SetScrollRange(-180,180);m_scroll3.SetScrollPos(0);m_scroll4.SetScrollRange(0,350);m_scroll4.SetScrollPos(200);m_scroll5.SetScrollRange(0,300);m_scroll5.SetScrollPos(115);m_scroll6.SetScrollRange(0.00,300.00);m_scroll6.SetScrollPos(50.00);a=b=c=0;fs=50.00;SetTimer(1,100,NULL);Ctrl=0;cx=200;cy=115;COLOR1=RGB(123,234,43);COLOR2=RGB(123,123,0);COLOR3=RGB(123,24,235);COLOR4=RGB(0,123,95);COLOR5=RGB(23,234,34);COLOR6=RGB(234,124,0);COLOR7=RGB(0,43,98);return TRUE;// return TRUE unless you set the focus to a control} void CDrawDLG::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){ int nID=pScrollBar->GetDlgCtrlID();switch(nID){ case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: a--;break;

case SB_LINERIGHT: a++;break;

case SB_PAGELEFT: a-=10;break;

case SB_PAGERIGHT: a+=10;break;

case SB_THUMBTRACK: a=nPos;break;}

if(a<-180)a=180;

if(a>180)a=-180;

pScrollBar->SetScrollPos(a);

break;case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: b--;break;

case SB_LINERIGHT: b++;break;

case SB_PAGELEFT: b-=10;break;

case SB_PAGERIGHT: b+=10;break;

case SB_THUMBTRACK: b=nPos;break;}

if(b<-180)b=180;

if(b>180)b=-180;

pScrollBar->SetScrollPos(b);

break;case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: c--;break;

case SB_LINERIGHT: c++;break;

case SB_PAGELEFT: c-=10;break;

case SB_PAGERIGHT: c+=10;break;

case SB_THUMBTRACK: c=nPos;break;}

if(c<-180)c=180;

if(c>180)c=-180;

pScrollBar->SetScrollPos(c);

break;case IDC_SCROLLBAR4: cx=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: cx--;break;

case SB_LINERIGHT: cx++;break;

case SB_PAGELEFT: cx-=10;break;

case SB_PAGERIGHT: cx+=10;break;

case SB_THUMBTRACK: cx=nPos;break;}

if(cx<0)cx=200;

if(cx>350)cx=200;

pScrollBar->SetScrollPos(cx);

break;case IDC_SCROLLBAR5: cy=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: cy--;break;

case SB_LINERIGHT: cy++;break;

case SB_PAGELEFT: cy-=10;break;

case SB_PAGERIGHT: cy+=10;break;

case SB_THUMBTRACK: cy=nPos;break;}

if(cy<0)cy=300;

if(cy>300)cy=0;

pScrollBar->SetScrollPos(cy);

break;

case IDC_SCROLLBAR6: fs=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: fs--;break;

case SB_LINERIGHT: fs++;break;

case SB_PAGELEFT: fs-=0.55;break;

case SB_PAGERIGHT: fs+=0.55;break;

case SB_THUMBTRACK: fs=nPos;break;}

if(fs<0)fs=50;

if(fs>300)fs=50;

pScrollBar->SetScrollPos(fs);

break;// UpdateData(FALSE);} // Invalidate();Draw();CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} void CDrawDLG::OnOK(){ KillTimer(1);

CDialog::OnOK();} int CDrawDLG::Maxnum(int *p, int n){ int max=p[0];int x;for(int i=0;i<=n;i++){

if(max<=p[i])

{ max=p[i];x=i;} } return x;} void CDrawDLG::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);

CDC dcmem;dcmem.CreateCompatibleDC(pDC);CBitmap bmp,*oldbmp;bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());oldbmp=dcmem.SelectObject(&bmp);CBrush brush[6];brush[0].CreateSolidBrush(COLOR1);brush[1].CreateSolidBrush(COLOR2);brush[2].CreateSolidBrush(COLOR3);brush[3].CreateSolidBrush(COLOR4);brush[4].CreateSolidBrush(COLOR5);brush[5].CreateSolidBrush(COLOR6);CBrush *oldbrush=dcmem.SelectObject(&brush[i]);dcmem.FillSolidRect(rect,COLOR7);dcmem.Polygon(x,4);dcmem.SelectObject(&brush[j]);dcmem.Polygon(y,4);dcmem.SelectObject(&brush[q]);dcmem.Polygon(z,4);dcmem.SelectObject(oldbrush);for(int b=0;b<6;b++)brush[b].DeleteObject();pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcmem,0,0,SRCCOPY);dcmem.SelectObject(oldbmp);bmp.DeleteObject();dcmem.DeleteDC();} 4.7.2 运行结果如下:

(1)实现多面体的上下左右平移(2)实现多面体的绕轴旋转:

(3)实现多面体的放大缩小:

(4)实现多面体及背景的颜色设置:

(5)三维图形变换整体图形

五、实验心得体会

在本次课程设计过程中,基本掌握了计算机图形学关于图形绘制变换的基础知识,DDA法画直线和中心点法画圆及椭圆的方法,还对图形的变换及需要用到的一系列的函数有了相应的理解,也了解的很多有关于图形学中三维图形的变换的知识。不过都只是皮毛而已,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己的水平,以便在以后的生活里多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。

在本次课程设计中,设计方案存在着很多的死板化的实现方法,也是很不人性化的一点,只提供了画一种曲线的方法,且画出的曲线只能移动,此为本次设计方案的不足之一;然后就是能实现曲面和多边形的绘制,却没有对应的实现绘制好图形后直接对其进行平移、选择等变换,此为设计方案不足之二。再者就是三维图形只能实现变换不能实现绘制,此为设计方案不足之三。鉴于个人能力真的有限,所以只能设计出此种级别的效果了。因为实验重要的只是思想过程,效果的不美观只能是因为学习的知识还远远不够,所以不能设计出完美的全面的图形绘制变换程序。

经过此次设计,使我学到了很多东西,在没有开始做程序之前,没有任何思路,不知道该从哪里入手,可能是因为自己平时不认真听课的缘故。后来经过上网查询资料,翻阅参考书,在别人做的程序的启发下,才有了做此程序设计的眉目。在设计过程中遇到了很多的问题,在这里需要感谢王征风老师的帮助和指导,以及同学的帮助,最后一个个问题都被解决了,写出了完整的程序设计。最后也发现,其实只要努力,写出一个设计不是很困难,重要的是自己在写程序的过程中,要会学习,会查阅资料。这次的课程设计让我学习到了很多,以后我会努力提高自己在图形学方面的知识水平。

下载迭代法求两点边值问题课程设计分解word格式文档
下载迭代法求两点边值问题课程设计分解.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐