数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 6273|回复: 10

精华帖--数学竞赛所出精华,感谢大家对数模的支持

[复制链接]
发表于 2003-12-21 04:05:00 | 显示全部楼层 |阅读模式
以下为半年来所出精华现已整理,感谢大家对数模的支持

[分享]优秀科技论文的五要素
一、创新性

      在科学与技术的发展处于转折、发现和革命的时期,像本世纪之初量子论诞生那

种充满重大发现的年代;像四十年代未至五十年代初发明晶体管的年代,像五十年代发

现DNA双螺旋结构从而开创分于生物学的激动人心的时期,创新是一种科学发现,它必将

开创一个新的学科领域,对人类的认识在哲学的高度上产生深远的影响,对于这些科学

革命时期的创新,学术界很容易理解和体会它的含义,这不属于本文论述的重点;本文

所关心的是处于科学技术平稳的发展时期,由一般科技人员撰写的论文,它的创新性究

竟是指什么,请先看一下

《Nature》与《Science》的说明。

      《Nature》认为创新是科研成果新颖,引人注意(出入意料或令人吃惊),而且

该项研究看来在该领域之外具有广泛的意义,无论是报道一项突出的发现,还是某一重

要问题的实质性进展的第一手报告,均应使其他领域的科学家感兴趣。《Science》则认

为,创新是指,对自然或理论提出新见解,而不是对已有研究结论

的再次论证,内容激动人心并富有启发性,具有广泛的科学兴趣。具体而言,就是说在

已沉寂的研究领域提出创新思想,在十分活跃的研究领域取得重大进展或者是将原先彼

此分离的研究领域融合在一起。

      读者不难看出,上述要求并不是容易达到的,即使是在这两种刊物上己发表的论

文,也并不是都能达到这个要求,如果有10%的论文能达到这个要求也就相当不错了,显


然这种要求是办刊人员的奋斗目标和期刊的最高标准,为了比较,再来看一看《科学通

报》、《中国科学》和《自然科学进展》这三种全国性综合期刊对创新性的要求,它们

的要求是共同的。即在基础研究和应用研究方面具有创造性的。高水平和有重要意义的

最新研究成果。读者可能己注意到这里对创新性的要求与《Nature》、《Science》的要

求不同之处在于没有特别强调论文的内容应能引起科技界广泛的兴趣,用现在流行的话

来说,就是大家广泛关注的热点问题,作为国际科学期刊,《Nature》与《Science》强

调这一点是应当的,也是可以实现的,他们可以从众多的来稿中筛选出符合这一要求的

论文;而国内期刊需要根据本国科研的实际需要和整个背景情况来慎重地对待这个要求

,其实,随着国家科学基金个人申请项目的逐年增多,申清人就可以既根据个人的专长

,又根据当前国内外自己所熟悉的科学前沿进展确立科研选题,那么假以时日,这个要

求也就不难达到了。但是,需要特别指出的,像《Nature》与《Science》这样著名的国

际科学周刊,在全世界也只此两家,我们没有可能。也没有必要完全照搬那些不符合国

情的东西,毕竟,意义重大的论文或研究成果一定会引起相关领域科技人员的关注。

    笔者认为,一篇沦文或一项研究课规模不一定很大,但研究一定要深入,结果一定

要深刻,要能反应研究者独到的见解。这样的论文列入高水平论文想必不会有疑问了。

二、可读性

    一篇科学论文的可读性是至关重要的,应当引起作者的高度重视。可读性是由如下

因素决定的:

    1。研究工作是否取得了实质件进展,所得结论是否可靠,结果是否深刻和有启发性

,如果是阶段性成果,它对后续的研究有什么指导意义,是否是重要发现的前奏。

    如果研究工作没有获得阶段性或最终的结果,就不应动手写论文,靠一个平淡的研

究工作无论如何是写不出一篇好文章来的,因而也不可能是一篇具有可读性的文章。

    2,作者要对论文进行完整的构思,体现严密的逻辑思维,一项研究课题经过长期努

力工作而得到结果时,就应当像艺术家构思一幅作品那样,一丝不苟。精雕细刻,对论

文的论述方式,内容的取材,学术思想的解释,研究背景的介绍等等需要反复推敲,仔

细斟的,以期作到论文的结论严谨,内容充实。论述完整。逻辑性强。如果作不到这一

点,那么论文就很难引起读者的阅读兴趣了。

    3。在论述方式上,要作到深入浅出,表达清楚。简练。专业术语准确,前后一致,

语言要规范。生动。

    4。文字与插图恰当的配合。国内相当多的论文在利用图、表来生动地阐述学术内容

方向还显不足,随着计算机三维可视化方法的普及,论文中采用彩图、立体图的趋势将

会增加,这可以避免过多的文字说明,而且效果也比较好。

    5。论文的体例格式。虽然每一期刊都制定了能反映他们自己的风格和特点的体例要

求,但大体上,学术期刊有一个共同的体例要求,读者对此并不陌生,不过真正认真照

着去作的却不多,作者可能很少思考这样一个问题学术期刊为什么要提出体例要求?须

知这不是可以随意对待的事。体例不仅保证了论文形式上的规范,也保证了内容上的可

读性,恰恰就是这一点被许多作者所忽视了,其中,论文的标题。摘要和关键词这三者

基本上决定了论文能否被期刊所采纳和能否引起读者的兴趣。进入《科学文献索引》的

优秀期刊《Chinese physics  Letters》(中国物理快报)一再申明:本刊特别注重文

章的标题。摘要的编写。目的在于提高文章的引用率。标题应该清晰地描述文章的内容

,又能反映与其他文献的区别。关于摘要,首先要求是对文章时主题及其所属的领域和

研究对象给予简短的叙述,更重要、更严格的要求是对文章的理论或实验结果、结论以

及其他一些有意义的观点给出情晰,明确、较具体的简要的叙述。可见这三者对一篇论

文是能产生画龙点睛的效果的。国内有些论文的一个通病是喜欢包罗万象的,大而空的

标题,接着又是言过其实,空洞无物的掖要。例如说一次观测就得出一个变化规律;一

个算法就解决了一个NP问题,等等,罗列的关键词不能反映论文的中心议题,也不便于

检索,这样就使得读者没有兴趣再读下去了,出现这样的结果,何谈沦文的可读性?

      请看一下《Nature》在投稿指南第二条上对可读性是如何解释的:来稿应写得清

楚。简练,以便让其他领域的读者和母语为非英语的读者能能够读懂。基本的但又属于

专业的术语应作简明解释,但不要说教式的。在投稿之前请从事其他学科研究的同事对

最终文稿在清楚易懂方面提供意见往往很有用。《Nature》杂志的编辑常常建议修改并

重写论文的摘要和正文的第一段(即引言),…,并保证文章和图片对非该领域的读者

明确。能读懂。这再清楚不过地说明了论文的可读性是何等重要,《Nature》杂志一再

申明,论文是否利用最终决定权属于编辑部,凡不符合他们要求的稿件,毋需深人阅读


即行退稿,道理很简单,在大量来稿的情形下,编辑不可能花太大多的精力和时间去处

理一篇可读性很差的稿件。

      谈到可读件,使笔者回想起在数学界流传很广的一件恢事。在本世纪之初,Hilb

ert由于提出23个数学论题而名声大振,有人间他何谓一3个好的数学选题,Hilbert毫个

犹豫地回答:清晨与你漫步时,能向你遇到的第一位行人用10分钟时问解释消楚的数学

选题。可见简明,清楚、易懂是一篇论文必须具备的基本条件。

      当然,《Nature》与《Science》不是专业杂志,他们特别重视论文可读性是可以

理解的,那么,专业期刊是否就不必这样认真对待可读性问题呢,事实上,可读件是指

读者在读过你的文章之后,能够明了你要说的什么问题,是怎样着手解决的,并不需要

读者非得全面理解你的论文的全部内容,因此,专业期刊同样要求论文具有可读件,如

果一篇论文由于可读性差而失去很多读者,对于期刊本身而言,负面影响将是严重的。三。信息量

      信息量是源于通信领域而逐渐普及成为大众与媒体频繁使用的一个词,将它与一

篇科技论文联系起来,是指在篇幅有限的情况下,论文本身能向读者提供多少有关该论

题的信息。笔者在《Chinese physics  Letters》的投稿规范上看到,它是指“要尽可

能多地给出有关研究的信息,尽可能少地运用investigate(调查),study(研究),

disuss  (讨论)等词,并举例作了进一步解释,如“The  cross section is (6.25±

0.02)就比“The cross section is measured”包含更多的信息量。通俗地讲,读之前

或许不知道,或者模糊不消或不确切的知识在读过该文之后不仅获得新知识,还消除了

模糊不清或不确切之处,就说明这篇文章包含较多的信息量。简言之,当你读完一篇文

章后获得的新知识越多,说明它的信息量就越大。显然,“多点测量”的信息量要比“

6点测量”少得多,前者给出的是模糊的、不确切的信息,而后者则是清楚的。确切的信

息。

      现在,国内外一些著名期刊对论文的篇幅作了严格限制,这样作的意义何许呢,

显然新的学术思想,新的实验,新的发现……等等创新结果是决定论文信息量的关键,

但是不可否认,篇幅的严格限制会促使作者想方设法删除那些与文章主题关系不大的或

次要的内容,作者面对篇幅的限制,不得不一次又一次地重新构思论文的框架,选择最

重要的素材,采纳最恰当的表述方式并对文字的叙述仔细推敲,这样作的结果,一般来

说论文的内容充实了,(信息量上增加了,主题鲜明了,论文的质量也相应地提高了。


      著名的国际学术期刊《Physical Review Letter》的编辑首先对来稿从标题、图

表、数学公式直到参考文献逐一计算所占的行数,总行数绝对不能超过46O行,否则即退

回作者重新修改,精练内容到符合要求为止。

      篇幅虽少但内容不充实,论文包含的信息量太少则很难被编辑,申稿人认为是篇

好文章,退稿是预料之中的事。

      从上可知,限制论文篇幅隐含着对信息量的要求,只要作者认真对待,反复修攻

,精练自己的叙述方式,就能够改善论文的质量,尤其是增加信息量。

      在这方面值大家借鉴的是,Watson与Crick发现DNA双螺旋结构的论文发表在《Na

ture》上,只有约500字和一幅DNA的双螺旋图,就是Penzias和Wilsoh发现字宙大爆炸的

3K背景辐射的技术观测论文也只有一页篇幅,而这两篇论文则使作者分别获得了诺贝尔

生物医学奖与物理学奖。
四、参考文献

    将参考文献列为评价一篇论文质量的标准之一,可能会使读者和作再感到惊奇,甚

至产生异议,这并不奇怪。因为笔者认为,参考文献在一篇论文中的地位,以往是被大

大忽视了。现在有了《科学文献索引》,就不难理解参考文献在论文中的重要作用了,

由美国宾州的科学信息研究所(Institute for Scientific information,ISI)倡导的

按论文被引用的次数来评价研究成果的思想就产生了SCI,它除了收录论文的作者、题目

、源期刊、摘要、关键词之外,还特意将论文所列的参考文献全部收录下来,这样就能

把一篇论文同其他论文之间有学术意义的联系勾画出来,从而沟通了不同作者群体之间

的学术联系,并进一步统计出期刊的影响因子(Impact  Factor),即某一期刊在连续

两年内发表的论文总数为A,第三年它被引用的次数为B,影响因子IF=B/A,意指该刊两

年内所发表的论文在第三年彼引用的平均次数。它反映了该期刊在世界范围内的影响,

在不同刊物上发表文章其难易程度相差可能很大。可见参考文献对计算影响因子和评价

论文水平所引起的巨大作用。

    当然,有一些非常优秀的论文并不一定刊登在影响因子很高的期刊上,例如Lorenz的

“确定性非周期流”;Feigenbaum的“非线性变换的普适测度特性”以及Shannon的“通

讯的数学理论”,等等,用IF作为唯一衡量

标准显然是不公允的,偏颇的。

    对于作者来说,一项研究工作从选题开始就离不开阅读文献资料,在撰写论文时,

一定要将你产生新的学术思想之前最重要的文献列举出来,说明当时的研究所达到的水

平;在研究工作开展中,受哪些文献资料的启发,从哪些论文中获得了教益,促进了研

究进度,属于这类的文献均应列出,写论文时应对论文涉及的学科内容进行检索,看看

是否遗漏了重要的相关文献,有一个感人至深的事例,就是孟德尔(Mendel J.Gr)的豌

豆杂交实验,他把从两年实验中总结出的杂交组合法则发表在“自然研究协会”的杂志

上,几乎没有引起人们的注

意,他去世16年以后,三位有名的生物学家彼此独立地再次发现了他得出的组合法则,

他们是荷兰人de  Vries、奥地利人Tschermak-Seysengg和德国人Correns,他们同在19

00年递交了自己的论文,为慎重起见,又不约而同地各自查找了有关豌豆杂交实验的全

部资料和论文,恰巧同时发现孟德尔早于他们30多年就发现了杂交遗传的规律,为了表

示对前人的敬仰和尊敬,他们各自在论文中将该规律称作孟德尔定律,如果他们三人轻

视论文中的参考文献,那么其后果将会多么今后世人遗憾啊!类似的例子还有很多。总

之,一篇论文所代表的研究只能起到承前启后孔作用,除了自己独立而创新的那一部分

内容外,在论文中不必也不可能对涉及到的相关问题

逐个详细论述,这时给出有关的参考文献,以说明结论、观点、数据的来源,读者如想

深入了解这个问题就可查阅文献,这样一来,文献就成了自己论文的补充和完善,编辑

和审稿人将根据论文中开列的文献消单初步判断该论文的水平以及作者对有关学科的背

景知识水平,自然在一定程度上也可以判断作者的科学道德,如果不是受文献检索条件

的限制,你未能在论文中列出与你的研究密切相关的主要文献,读者、编辑和审稿人可

能会看作是一种不良学风,这对你的事业可能会产生严重的损害。

      参考文献的选择是一项极为严肃的事,它关系到论文的可信度和作者的声誉,论

文的作者对所开列的主要文献均应认真阅读过,并向读者保证论文中某处引用的参考文

献的确与该处的内容有关,文献发表的刊物、年代、卷号、标题、页码同样应核实无误

,期刊的编辑人员花在这方面的时间和精力是很多的,但许多作者

对此却了解甚少,采取了轻慢的态度。

      国内学术论文在引用参考文献上存在以下问题

      1、为了省事,转引二手文献,既不核对,自己也没有看过或浏览过,引用是否恰

当、准确,一般则很少考虑。

      2。只引自己的论文,这既是自负又是无知的表现,读者、编辑和审稿人认为只引

作者自己的论文,说明作者的研究课题没有引起同行的关注,不属于热点课题,也不属

于前沿课题,同时还认为作者对当前该领域各相关学科的进展不了解,起码很长时间没

有查阅文献资料或阅读学术期刊了。对于这类论文国内编辑部一般采取十分宽容的作法

,就是退请作者作补充,因为出现这类现象的作者有些还是学术界资深的研究员;国外

这类现象很少见,遇上了自然是作退稿处理。

      3,阅读的是中文文献,引用的是外文文献。以D.Marr的《Vision》一书为例,该

书由于创立了视觉的计算理论而在国际上久负盛名,国内很及时翻译出版了中文本,成

为从事生物视觉。计算机图像处理,机器人视觉研究的必读之书,遗憾的是,不少作者

在中文期刊论文中却引了该书的英文原著,实际情况是,英国原著在全国没有几本,就

是中国科学院图书馆也没有,那么许多读者是从哪里得到原版著作阅读呢,中文版是几



专家历经干辛万苦完成的一本语言流畅、表达准确、可读件很高的译著,当你从中学得

了有用的知识后,为什么只引用英文原著,而不引用中文译著呢?

      4。引用文献中近三年之内的比例少,这自然和国内外文期刊少,同内读者获得外


文期有较大时间滞后有关,随着Inlernet的发展,这种情况会得到改善。

      笔者将参考文献作为判断一篇论文质量的标准之一,相信会被越来越多的作者、

读者、编辑同仁以及审稿专家理解和认同。

五、署名与致谢

      科技论文的署名是一件极其严肃的事,应按研究工作实际贡献的大小确定署名,

论文中的每一位作者均应对其论点,数据和实验结果 械9比 ,其中责任作者还应当对

读者的质疑有答辩的能力与义务。不恰当的署名既可能失去获得科学奖励的机会,又可

能严重损害论文与作者的声誉。诺贝尔生理医学奖得主Baltimore于1986年在他本人并不

熟悉的、不知道有伪造实验数据的论文上署名,造成了恶劣影响,受到科学界严厉的谴

责,论文被宣布撤回,他本人引咎辞职,因此,优秀科技论文的署名反映了作者的科学

道德,应经得起时间的考验。

      一篇科技论文所涉及的研究工作在很多情况下是由一个研究小组完成的,至少包

含了课题组的贡献,也包含了作者与同事,同行的学术交流与讨论,甚至向其他专家学

者当面的或书面的请教。也包括经费的支持和工作条件的保障,等等,在这种情况下,

作者通过论文对自己的学术思想,研究进展提供过帮助的主要人员表示致谢是完全应当

的,特别是在学术上。科学问题方面对自己的研究提供过帮助或得到过启发的人员,一

定要向他们致谢。

      在第二次世界大战结束后,科学界出现了一次极不公平的诺贝尔奖事件,当时著

名的女物理学家莱丝·梅特娜(Lise  Meitner)对核裂变作出了重大贡献,由于出身犹

太民族受到迫害离开德国后,她曾通过大量书信促进(实际上也指导了)奥托·哈恩(

Otto  Hahm)进行实验工作,遗憾的是哈恩为了独得 当 尔奖,未能向评委会提供这些


内情,既未在论文中署上梅特娜的名字,也未向她致谢,终于将梅特娜排斥于诺贝尔奖

之外,使科学界感到极大的震动,哈恩的品行将永远受到谴责。

      论文的作者千万不要轻视致谢这件事,把它看成是可有可无的事,自已论文公开

发表后,就用书面形式记载了你的和科研成果,同时上记下了你的科研道德,像哈思那

样的事,无论它的档次多高,还是不出现为好。

      以上五个要素,是一篇优秀科技论文必须具备的,至少是应当努力去实现的目标

。编辑、审稿人实际上是与作者一起为实现这一目标在不懈地工作着,关键当然还是作

者自己。




以上为qxfy 所提供



[此贴子已经被作者于2003-12-20 21:00:18编辑过]

 楼主| 发表于 2003-12-21 04:16:19 | 显示全部楼层
[原创]一个单摆运动的动画演示,很有意思!
>> t=0:pi/48:4*pi;
>> y=sin(t);
>> plot(t,y,'b')  %绘制正弦曲线
>> %下面利用线绘制小球,并定义线的颜色,线形大小和擦除方式
>> %小球对象的句柄存放在变量h中,后面利用这个句柄对小球控制
>> h=length(t);
>> h=line('color',[0 0.5 0.5],'linestyle','.','markersize',50,'erasemode','xor');
>> %最关键的一点把擦除方式设为'xor',这样才能实现好的动画效果
%下面为脚本文件
i=1
while i=1
set(h,'xdata',t(i),'ydata',y(i));
drawnow;
i=i+1;
    if i>n
       i=1
   end
end  %终止运行可按ctr+break

>> g=9.8;
>> l=1;
>> theta=pi/6;
>> x0=l*sin(theta);
>> y0=-l*cos(theta);
>> axis([-.75,0.75,-1.25,0])
>> axis off
>> %用线创建摆捶
>> head = line(x0,y0,'color','r','linestyle','.','erasemode','xor','markersize',40);
>> %用线来创建单摆
>> body = line([0;x0],[0;y0],'color','b','linestyle','-','erasemode','xor');
>> pend
%pend.m文件
t=0;
dt=0.01;
while 1
    t=t+dt;
    theta0=theta*cos(sqrt(g/l)*t);
    x=l*sin(theta0);
    y=-l*cos(theta0);
    set(head,'xdata',x,'ydata',y);
    set(body,'xdata',[0;x],'ydata',[0;y]);
    drawnow;
end


以上为shaojie提供

 楼主| 发表于 2003-12-21 04:19:18 | 显示全部楼层
推荐]Word排版技巧——所有与内容无关工作都交给Word
花一天时间学好Word排版,绝对是一劳永逸的事。
Word不是最重要的,但绝对是影响建模表达、写作效率和修改方便性的关键。
所有与内容无关的排版工作都交给Word去完成吧。

  记得初识数模时,Word曾让下天同志郁闷了半个夏天;后来参加了几次大赛,自以为Word用得还可以,结果毕业设计时经高人提点,发现Word竟可以这样用。好东西当然要大家一起分享,现介绍***(网上down的,未能核实真身)的大作如下,以抛砖引玉:
------------------------------------------------------------------
用Word编辑论文的几个建议

  由于各方面的原因,大家主要还是用Microsoft Word (以下简称Word)编辑论文。Word在写科技论文方面虽然有一些先天不足,但却提供了非常强大的功能。如果不能充分利用这些功能,可能经常要为不断地调整格式而烦恼。我把自己以前使用Word的经验和教训总结一下,抛块砖。
原则: 内容与表现分离
====================
  一篇论文应该包括两个层次的含义:内容与表现,前者是指文章作者用来表达自己思想的文字、图片、表格、公式及整个文章的章节段落结构等,而后者则是指论文页面大小、边距、各种字体、字号等。相同的内容可以有不同的表现,例如一篇文章在不同的出版社出版会有不同的表现;而不同的内容可以使用相同的表现,例如一个期刊上发表的所有文章的表现都是相同的。这两者的关系不言自明。在排版软件普及之前,作者只需关心文章的内容,文章表现则由出版社的排版工人完成,当然他们之间会有一定交互。Word倡导一种所见即所得(WYSIWYG)的方式,将编辑和排版集成在一起,使得作者在处理内容的同时就可以设置并立即看到其表现。可惜的是很多作者滥用WYSIWYG,将内容与表现混杂在一起,花费了大量的时间在人工排版上,然而效率和效果都很差。本文所强调的“内容与表现分离”的原则就是说文章作者只要关心文章的内容,所有与内容无关的排版工作都交给Word去完成,作者只需将自己的排版意图以适当的方式告诉Word。因为Word不仅仅是一个编辑器,还是一个排版软件,不要只拿它当记事本或写字板用。主要建议如下。
  1. 一定要使用样式,除了Word原先所提供的标题、正文等样式外,还可以自定义样式。如果你发现自己是用选中文字然后用格式栏来设定格式的,一定要注意,想想其他地方是否需要相同的格式,如果是的话,最好就定义一个样式。对于相同排版表现的内容一定要坚持使用统一的样式。这样做能大大减少工作量和出错机会,如果要对排版格式(文档表现)做调整,只需一次性修改相关样式即可。使用样式的另一个好处是可以由Word自动生成各种目录和索引。
  2. 一定不要自己敲编号,一定要使用交叉引用。如果你发现自己打了编号,一定要小心,这极可能给你文章的修改带来无穷的后患。标题的编号可以通过设置标题样式来实现,表格和图形的编号通过设置题注的编号来完成。在写“参见第x章、如图x所示”等字样时,不要自己敲编号,应使用交叉引用。这样做以后,当插入或删除新的内容时,所有的编号和引用都将自动更新,无需人力维护。并且可以自动生成图、表目录。公式的编号虽然也可以通过题注来完成,但我另有建议,见5。
  3. 一定不要自己敲空格来达到对齐的目的。只有英文单词间才会有空格,中文文档没有空格。所有的对齐都应该利用标尺、制表位、对齐方式和段落的缩进等来进行。如果发现自己打了空格,一定要谨慎,想想是否可以通过其他方法来避免。同理,一定不要敲回车来调整段落的间距。
  4. 绘图。统计图建议使用Execel生成,框图和流程图建议使用Visio画。如果不能忍受Visio对象复制到Word的速度,还可以试试SmardDraw,功能不比Visio弱,使用不比Visio难,速度却快多了。如果使用Word的绘图工具绘图,最好以插入Word图片的方式,并适当使用组合。
  5. 编辑数学公式建议使用 MathType5.0,其实Word集成的公式编辑器是它的3.0版。安装MathType后,Word会增加一个菜单项,其功能一目了然。一定要使用 MathType 的自动编号和引用功能。这样首先可以有一个良好的对齐,还可以自动更新编号。Word 正文中插入公式的一个常见问题是把上下行距都撑大了,很不美观,这部分可以通过固定行距来修正。
  6. 参考文献的编辑和管理。如果你在写论文时才想到要整理参考文献,已经太迟了,但总比论文写到参考文献那一页时才去整理要好。应该养成看文章的同时就整理参考文献的习惯。手工整理参考文献是很痛苦的,而且很容易出错。Word没有提供管理参考文献的功能,用插入尾注的方法也很不地道。我建议使用 Reference Manager,它与Word集成得非常好,提供即写即引用(Cite
while you write,简称Cwyw)的功能。你所做的只是像填表格一样地输入相关信
息,如篇名、作者、年份等在文章中需要引用文献的的方插入标记,它会为你生成非常美观和专业的参考文献列表,并且对参考文献的引用编号也是自动生成和更新的。这除了可以保持格式上的一致、规范,减少出错机会外,更可以避免正文中对参考文献的引用和参考文献列表之间的不匹配。并且从长远来说,本次输入的参考文献信息可以在今后重复利用,从而一劳永逸。类似软件还有Endnote和Biblioscape。Endnote优点在于可以将文献列表导出到BibTeX格式,但功能没有ReferenceManager强大。可惜这两个软件都不支持中文,据说Biblioscape对中文支持的很好,我没有用过,就不加评论了。
  7.使用节。如果希望在一片文档里得到不同的页眉、页脚、页码格式,可以插入分节符,并设置当前节的格式与上一节不同。
  上述7点都是关于排版的建议,还是要强调一遍,作者关心的重点是文章的内容,文章的表现就交给Word去处理。如果你发现自己正在做与文章内容无关的繁琐的排版工作,一定要停下来学一下Word的帮助,因为Word 早已提供了足够强大的功能。我不怀疑Word的功能,但不相信其可靠性和稳定性,经常遇到“所想非所见”、“所见非所得”的情况让人非常郁闷。如果养成良好的习惯,

这些情况也可以尽量避免,即使遇上,也可以将损失降低到最低限度。建议如下:
  8.使用子文档。学位论文至少要几十页,且包括大量的图片、公式、表格,比较庞大。如果所有的内容都保存在一个文件里,打开、保存、关闭都需要很长的时间,且不保险。建议论文的每一章保存到一个子文档,而在主控文档中设置样式。这样每个文件小了,编辑速度快,而且就算文档损坏,也只有一章的损失,不至于全军覆灭。建议先建主控文档,从主控文档中创建子文档,个人感觉比先写子文档再插入到主控文档要好。
  9.及时保存,设置自动保存,还有一有空就ctrl+s。
  10.多做备份,不但Word不可靠,windows也不可靠,每天的工作都要有备份才好。注意分清版本,不要搞混了。Word提供了版本管理的功能,将一个文档的各个版本保存到一个文件里,并提供比较合并等功能。不过保存几个版本后文件就大得不得了,而且一个文件损坏后所有的版本都没了,个人感觉不实用。还是多处备份吧
  11.插入的图片、和公式最好单独保存到文件里另做备份。否则,哪天打文档时发现自己辛辛苦苦的编辑的图片和公式都变成了大红叉,哭都来不及了。
其他建议:
  12. 使用大纲视图写文章的提纲,调整章节顺序比较方便
  13. 使用文档结构图让你方便的定位章节
  14. 使用文档保护,方便文章的审阅和修改
  15. Word表格的排序、公式和转换的功能也是很值得学习的上面的建议并不全面,但相信比较管用。如果还有疑问,自己花些时间研究一下Word的帮助,相信会有事半功倍的效果。
------------------------------------------------------------------

  建议数模小组事先为本组的数模论文建立一个适合本组写作风格的模板,第一次可能会累一点,以后就只需套用模板,建模效率提高不少哦
  另外,大力推荐上文中Word自定义样式、交叉引用、分隔符等功能的使用;子文档就不必了,因为数模论文一般不长,不会超过20页;至于编辑公式是MathType5.0还是EQNEDIT好,见仁见智吧,用了就知道了。
  当然,以上只是建议,使用与否,大家视情况而定,希望能有所帮助
以上为下天所提供
 楼主| 发表于 2003-12-21 04:20:58 | 显示全部楼层
层次分析法的程序
我自己编了一个层次分析法的程序,供大家参考,还请大家多多指教。
function    W=aam(B,n)
%exemple
%A=[1 1/5 1/3;5 1 3;3 1/3 1];准则层对目标层的判断矩阵
%A1=[1 2 3];对应的下标
%C1=[1 3;1/3 1];方案层对准则层的判断矩阵
%C2=[1 1/5;5 1];
%C3=[1 2;1/2 1];
%C={C1,C2,C3};
%E={[1 2],[2 3],[1 2]};对应的下标
%B={{A,A1},{C,E}};
%n=[1 3 3];各层的因素个数
%W=ccf(B,n)
RI=[inf inf 0.58 0.96 1.12 1.24 1.32 1.41 1.45];
%一致性的修正值
ww1=[1];
p=length(n)-1;
for q=1:p
ZCR=[];
ww2=zeros(n(q+1),n(q));
for j=1:n(q)
[V,D]=eig(B{q}{1}{j});
[D,I]=max(max(D));
m=n(q+1);
CI=(D-m)/(m-1);
CR=CI/RI(m);
ZCR=[ZCR;CR];
coherence;
%一致性检验的函数
V=V(:,I);
k=sum(V);
w=V./k;
ww2(B{q}{2}{j},j)=w;
end
CR=ww1'*ZCR;
coherence;
ww1=ww2*ww1;
end
W=ww1;

coherence.m
if CR>0.1
  'error'
  return
end

以上为xiouxingzhe提供
 楼主| 发表于 2003-12-21 04:30:14 | 显示全部楼层
随机模拟与蒙特卡罗法
分子聚集体或宏观物系的结构与物理化学性质可以通过求相应物理量的系综平均值得
到。但是,系统的
状态数常常是一个近乎天文的数字。比如,对一个大小的一个二维点阵,即使每个点只能
取两个状态,
系统可能取的状态总数为。这样,求一个平均值,就是用速度为每秒数万亿次的巨型计算
机,
它也要算上至少年。显然,这是根本无法做到的。计算机随机模拟方法是用一小部分“代
表”状态上
的算术平均值近似系综平均值。
    计算机随机模拟是在电子计算机上对随机现象进行模拟并进而得到问题解答的方法的
简称。其中所说的
随机现象可以是原问题本身所固有的,也可以是人为建立起来的与原问题答案有一定关系
的某随机现象。计
算机随机模拟方法亦称蒙特卡罗方法(Monte Carlo Method),后一名称已被国内外广大学
者所普遍采用。蒙
特卡罗方法的程序大都为专门应用设计,一般的应用程序不会太复杂,可以自己编写。一
个模拟退火算法程
序ASA(Adaptive Simulated Annealing)
可以在网上免费得到(http://www.ingber.com,
ftp://ftp.ingber.com),用于许多优化的目的。
1. 蒙特卡罗方法的名称与历史
    蒙特卡罗方法为计算数学中的一种计算方法,它的基本特点是,以概率与统计中的理
论与方法为基础,
以是否适于在计算机上使用为重要标志。因此,它虽属计算方法但又与一般计算方法有很
大区别。蒙特卡罗
是摩纳哥的一个著名城市,以赌博闻名于世。蒙特卡罗方法借用这一城市的名称,属于象
征性的,是为了表
明该方法的上述基本特点的。蒙特长罗方法也称统计试验方法或计算机随机模拟方法,这
些名称同样是为表
明该方法的上述基本特点的。   
    蒙特卡罗方法作为一种可行的计算方法,是由Ulam和Von Neumann在20世纪40年代中
叶为解决研制核武器
中的计算问题而首先提出并加以运用的。在此之前,作为该方法的基本思想,实际上早已
被统计学家所发现
和利用了。例如,早在17世纪的时候,人们就知道了依频数来决定概率的方法。又如,在
19世纪末,曾有很
多人进行随机投针试验。根据针与地面上平行线束(距离均为二倍针长)相交的概率P等
于的倒数,用频数
n/ N替代概率P,并进而得到。为了使p的有效数字达到4位,置信水平为0.95,所需投针
次数要
在40万以上。因此,在还不具备实现这样大量试验的条件之前,除非为其他目的,如上例
求p是为了验证大
数定律,不会有人用进行实际试验的办法来计算所要计算的值。
    进入20世纪40年代中叶,出现了电子计算机,使得用数学方法在电子计算机上模拟这
样大量的试验成为
可能。另外,科学技术的不断发展,出现了越来越多的复杂而困难的问题,用通常的解析
方法或数值方法都
很难得到解决。蒙特卡罗方法就是在这些情况下,作为一种可行的而且是不可缺少的计算
方法被提出和迅速
发展起来的。

2. 蒙特卡罗方法的一般原理
    蒙特卡罗方法解题的一般过程是,首先构成一个概率空间;然后在该概率空间中确定
一个依赖随机变量
A(可以为任意维)的统计量g(x),其数学期望

    作为G的近似估计。
    由以上过程看出,蒙特卡罗方法解题的最关键一步是,确定一个统计量,其数学期望
正好等于所要求的
值。为方便起见,后面将总称这样的统计量为无偏统计量。
    由于其他原因,如确定数学期望为G的统计量g(x)有困难,或为其他目的,蒙特卡罗
方法有时也用G的渐
近无偏估计代替一般过程中的无偏估计,并用此渐近无偏估计作为G的近似估计。
    蒙特卡罗方法的最低要求是,能确定这样一个与计算步数N有关的统计估计量
,当时,依
概率收敛于所要求的值G,亦即,对于任意的>0,应有
   
    其中P(·)表示事件·的概率。
子样:具有已知分布f(x)的总体,作为它的子样形式,在蒙特卡罗方法中通常被大家所采
用的是简单子样。
简单子样指的这样的随机子样,它们之间相互独立,对于任意的x和所有的n = 1,…,
N满足
   
    简单子样具有三个非常重要的性质。第一个性质是,对于任意的统计量具有同一分布

相互独立,数学期望均等于

蒙特卡罗方法的收敛性:蒙特卡罗方法的近似估计依概率1收敛于G,亦即
   
    的充分必要条件是无偏统计量g(x)满足
   
    就是说,蒙特卡罗方法的收敛性取决于所确定的无偏统计量是否绝对可积,确切些说
,是它的绝对数学
期望是否存在。
    如果无偏统计量g(x)满足条件

    亦即依概率1收敛G的速度为。就是说,蒙特卡罗方法出收敛速度取决于所确定的无偏
统计量是
几次绝对可积,但收敛速度总不会超过。
蒙特卡罗方法的误差:根据中心极限定理,只要所确定的无偏统计量具有有限的异于零的
方差,对于任
意非负的X均有
   
因此,当N足够大时,就可以认为有如下近似等式:
   
    其中为置信度,1 - 为置信水平。
    根据以上结果,我们可以根据问题的要求,确定出置信水平,然后按照正态积分表确
定出X来,而近似
估计 与真值G之间的误差就可以用下式近似地得到:   
      
    通常取X为0.6745、1.96或3,相应的置信水平依次为0.5、0.95或0.997。
    蒙特卡罗方法误差容易确定。对于-般计算方法,要想给出计算结果与真值的误差并
不是一件容易办到
的事情,蒙特卡罗方法则不然。根据蒙特卡罗方法的误差公式,其中的X是确定的,N是实
际的抽样数,未知
的仅仅是均方差。可是,它是可以通过计算的同时计算给出的,即
      
    对于再复杂的蒙特卡罗方法计算问题,均方差的确定大致上也是如此,因此,误差容
易确定成了蒙特卡
罗方法另一大优点。
    一般计算方法常存在着有效位数损失问题,要想解决这一问题有时还是相当困难的,
蒙特卡罗方法则不
存在这一问题。
蒙特卡罗方法的费用:根据上述误差公式,若问题所要求的误差为,置信水平为1    -
,X是按照正态
积分表由置信水平所确定的,则应有
   
    即子样容量N必须满足
   
    进一步假设每计算一次无偏统计量所需要的费用是C,则蒙特卡罗方法的总费用自然
应该是
   
    就是说,蒙特卡罗方法的费用与方法所确定的无偏统计量的方差及其费用C的乘积C成
正比。
    上述结果表明,在相同条件下,即在相同误差和置信水平要求下,一个蒙特卡罗方法
的好坏完全取决于
C的值的大小,其值越小相应的方法越好。
蒙特卡罗方法的收敛速度与问题的维数无关:由蒙特卡罗方法的误差公式看出,在置信水
平一定的情况
下,蒙特卡罗方法的误差除了与问题所确定的无偏统计量的方差有关以外,只取决于子样
的容量N,而与
无偏统计量g()中的是多少维空间的点无关。例如,如下的S重积分计算问题:
   
   蒙特卡罗方法的近似估计是
   
    其中,为S维方体内均匀抽样确定的点。由蒙特卡罗方法的误差公式不难看出,
如果无偏统计量g(x)的方差不变,则除了由于维数的变化可能引起每次观察费用作较小的
变化之外,蒙特卡
罗方法的误差是与维数S无关的,或者说,蒙特卡罗方法的收敛速度与问题的维数无关,
显然,这一特点是
其他计算方法所不常具有的。
蒙特卡罗方法受问题的条件影响不大:蒙特卡罗方法的另一个基本特点是,它受问题条件
限制的影响不
大。例如,对于上述积分,如果加上一个积分区域V的限制:
   
    则无论S维单位方体内的区域V如何特殊,我们都可以给出类似的近似估计如下:
   
    显然,这也是其他计算方法所不常具有的。 蒙特卡罗方法不必进行离散化处理:蒙
特卡罗方法的再一
个特点是,它不象其他计算方法那样对问题一定要进行离散化处理。明确些说,其他计算
方法需要事先确定
网格点,一旦网格点确定后,问题所关心的就是这些网格点上的值,而与其他点上的值无
关。蒙特卡罗方法
完全不需要这些。例如,在化工问题中的如下齐次积分方程本征值:
   
    其中和x为三维空间的点,V一般都比较复杂。对此问题,一般计算方法总是需要在积
分区域V上划分
网格点(这一步用计算机实现是比较困难的),实现离散化,使问题所关心的只是这些网格
点上的值(需要占
用计算机大量存贮单元)。蒙特卡罗方法则不需要这样做。很明显,蒙特卡罗方法的这一
优点,不仅使蒙特
卡罗方法更加适于解决那些高维问题,精确度进一步增加,节省计算机大量存贮单元,而
且给建立蒙特卡
罗方法通用程序带来了很大方便。
蒙特卡罗方法具有直接解决问题的能力:蒙特卡罗方法还有一个特点是,对于那些本身具
有统计性质的
所谓非确定性问题,不需要象常规方法那样首先将它转化成为确定性问题,如转化成某方
程的解,然后再
通过解决确定性问题得到问题的答案。例如,粒予进入屏蔽层与介质发生多次碰撞后可能
被吸收,也可能
反射回来或穿过屏蔽层,问题所关心的常是穿透概率。对于这样一个非确定性问题,常规
方法是首先给出
它所满足的方程,实际上是一个积分微分方程,即转化成为确定性问题,然后用某种计算
方法解这一确定
性问题,进而得到问题的解答。蒙特卡罗方法不需要将非确定性问题转化成为确定性问题
,可以直接从非
确定性问题出发,通过模拟原问题的实际过程得到问题的解决。在由非确定性问题转化成
确定性问题和用
计算方法解这一确定性问题过程中,常常需要作很多近似,蒙特卡罗方法则不需要,因此
,有人称蒙特卡
罗方法为精确的方法,并常依此为标准衡量其他方法的近似是否是合理的。
蒙特卡罗方法具有同时计算多个方案的能力:蒙特卡罗方法的再一个特点是,对于那些需
要计算多个方
案的问题,有时不需要象常规方法那样逐个方案遂个计算,而可以同时计算所有的方案,
其全部计算量几
乎与计算一个方案的计算量相当。例如,上述穿透概率计算问题,当屏蔽层为均匀介质平
几何情况,要计
算I种厚度的穿透概率时,用蒙特卡罗方法只须计算最厚一种情况,其他厚度的穿透概率
在计算最厚一种情
况时稍加处理便可同时得到。详细些说,在计算最厚一种屏蔽层的穿透概率时,粒子在屏
蔽层内随机游动,
对于各种厚度的屏蔽层,粒子是离开,或离开再进入,也可能再离开等等情况是请清楚楚
的。设第一次离
开各种厚度的粒子数依次为,观察的粒子总数为N,则,便分别近似等于各种
厚度屏蔽层的穿透概率。
蒙特卡罗方法的缺点:蒙特卡罗方法也存在一些缺点,这些缺点主要有,对于维数少的问
题,一般是二维
和二维以下问题,它不如其他计算方法好;对于大的几何系统或小概率事件的计算问题,
它的计算结果有
时比真值偏低;误差是概率误差,而不是一般意义下的误差。
3. 伪随机数
    我们已经看到,由具有已知分布的总体中产生简单子样,在蒙特卡罗方法的问题中占
有非常重要的地
位。总体和子样的关系属于一般和若干个别的关系,或者说属于共性和若干个性的关系。
由具有已知分布
的总体中产生简单子样,就是由简单子样中的诸个性近似地反映总体的共性。   
    在连续型分布中,最简单而又最基本的一个分布是单位均匀分布。在蒙特卡罗方法中
常把该分布的简单
子样作为基本量来看待,而由其他分布中产生简单子样时把它看成是已知的。因此,它们
虽然都属于由具有
已知分布的总体中产生简单子样的问题,但就产生的方法而言,它们之间却有着本质上的
差别。
    均匀分布也常称为矩形分布,其中最基本的是单位均匀分布。单位均匀分布的密度函
数如下:
     f(x) = 1,0≤x≤1。
    由具有单位均匀分布的总体中产生的简单子样:,简称为随机数序列,其中的每一个
体称为
随机数。随机数在蒙特卡罗方法中占有极其重要的地位。根据随机数的定义,随机数序列
是相互
独立的具有相同单位均匀分布的随机变量序列。随机数具有非常重要的性质:对于任意自
然数S,由S个随机
数所组成的S维空间上的点在S维空间的单位方体上均匀分布,亦即对于任意的,
0≤≤1,i = 1,…,S,如下等式成立:
   
    反之,如果随机变量序列,对于任意自然数S,由S个元素所组成的   
维空间上的点
在上均匀分布,则随机变数序列是随机数序列。
    在机器中若没有随机数发生器,可以用下面的子程序RAN产生随机数(在主程序中要先
调用INITRAN置初
值)。
   
4. 由已知分布的随机抽样
    由已知分布的随机抽样指的是由已知分布的总体中产生简单子样。用F(x)表示已知分
布的分布函数,
,表示由总体F(x)中产生的容量为N的简单子样。按照简单子样的定义,
是用相互独立的抽样方法产生的,具有相同的分布F(x)。由已知分布的随机抽样简称为随
机抽样。用表
示由已知分布F(x)所产生的简单子样中的个体。对于连续型分布常用密度函数f(x)表示总

体的已知分布。用表示由已知分布f(x)所产生的简单子样中的个体。
    抽样方法有好几种,如直接抽样方法、舍选抽样方法、复合抽样方法、复合舍选抽样
方法等。然而,
由于在实际问题中随机变量所服从的分布是千差万别的,用这些方法实现随机抽样有时还
会遇到困难。概
括起来说,可能遇到的困难主要有以下两点:一点是有的分布用上述抽样方法虽然可以实
现,但抽样效率
很低;另一点是有的分布用上述方法虽然可以实现,抽样效率也不低,但运算量太大。由
于上述原因,常
采用某种近似抽样方法。



5. 系综的平均观测量

6. 线型高分子链构象模拟示例
    线型高分子是由数目很大的结构单元连接而成的长链分子,例如分子量为28,000的聚
乙烯(PE),结构单
元数 = 1000。由于热运动及分子中的单键可以旋转而产生许多不同的构象。当分子量确
定后,随着构象的
变化,分子的尺寸也在变化。我们用分子末端距(线型高分子链两端的直线距离,h)的
均方根来作为描述
分子尺寸的参数,通常称为根均方末端距。一般情况下h应该是分子内化学键向量和的模
长(e是单位向量,
n和l分别为键数和键长)
   
    高分子链完全伸直时,主链为锯齿状,对聚乙烯有,l =    0.154nm。
    根据高分子构象的一些理论模型可以导出分子末端距。例如:

    柔性链模型的模拟则是在以链段长为半径的球面上取均匀分布的随机点,作为下一链
段的起点。同样
在n步以后,计算该链的末端距平方。统计了N条高分子链以后,计算出均方末端距。
7. 固体反应中成核过程模拟示例(化学物理学报,7/4 (1994),118)
    固体反应与在流体中进行的反应有很大差别,一般分为成核与生长两个阶段。
   在较低温度下,分散在母相中的产物以替代缺陷形式占据晶格点,构成二元物系。在
成对最近邻相互作
用近似下,各向同性互作用系的哈密顿可以表示为
     
    式中A和B分别是缺陷在格点上的形成能和成对能;当i格点被产物缺陷占据时,占有
数= 1,否则,被
反应物占据时,占有数 = 0;表示对所有格点位置求和, 表示求和仅对i的最近邻进行。
因而
分别是缺陷总数和缺陷对数。哈密顿第二项前的负号表示产物缺陷成对使体系
能量降低,这是产物相能成核从反应物相中分离出来的原因。
以上为流星赶月0454 提供

 楼主| 发表于 2003-12-21 04:35:33 | 显示全部楼层
三峡问题,土坡稳定性分析(瑞典圆弧法,瑞典条分法)

一 、瑞典圆弧法一 、瑞典圆弧法

 在均质粘性土坡中,滑动面的空间形状为一曲面,近似圆柱面,剖面上为一圆弧,简称滑弧。如图即为一简单粘性土坡,AC为假定滑弧,O点为滑弧圆心,其半径为R。滑动土体ABC视为刚体,在自重W作用下,将绕圆心O沿AC转动下滑,其下滑力矩 ;而阻止下滑的抗滑力矩是整个滑面上总抗剪强度与转动半径R之积,即。故假定滑动面上土坡的稳定系数为
             
  式中  τf - 滑动面上土的抗剪强度(假定滑面上τf为不变值);
      - 滑动面弧长;
       W - 滑动土体自重;
       d - W对圆心O的力臂。
  因滑动面是任意假定的,故所求的Fs不一定是最危险情况。要作多次滑弧位置的假定,求出相应的Fs值,取其 最小值作为土坡稳定系数。如果该值大于容许的Fs 值,即认为土坡是稳定的。
  这个方法首先是瑞典的彼得森提出的,故称瑞典圆弧法。它通常用于饱和(φ=0)的粘性土坡,即上式中。费伦纽斯通过大量计算认为,对均质粘性土坡,当φ> 0时,其最危险滑动面通过坡脚;而当φ=0时,其最危险滑动面也可能通过坡脚,这取决于土坡坡脚和坡底下卧硬土层埋藏深度。若假定最危险滑动面通过坡脚,对φ=0的土,其危险滑动面圆心位置可由上图中AO和BO的交点确定,图中β1、β2 值可根据坡脚由下表查到。对φ>0的土,最危险滑弧圆心位置如图所示,首先按φ=0法确定O点,然后作E点,位置关系如图所示,最危险滑弧圆心位置即在OE连线的延长线上。在OE的延长线上取圆心O1、O2、O3……等,分别算出相应的Fs1、Fs2、……等,通过O1、O2、……等分别以垂直OE的不同大小线段代表Fs1、Fs2、……值,联其端点,则曲线上最小的Fs值对应的Om点即是最危险滑弧圆心。但若土层较复杂,则Om不一定是最危险滑弧圆心。为此,尚可过Om作垂直于OE的线段,在该线段上再取几个点作圆心,分别求其相应的Fs,用上述办法求得最小的Fs和相应最危险滑弧圆心,即为所求。

二、瑞典条分法
  上述瑞典圆弧法是将滑体作为一个整体计算,对于外形复杂的土坡,滑体重心很难确定,而且当构成土坡为多层土、又有些外力(如渗透力、地震力等),整个滑体受力情况复杂,滑面上土的强度也不均匀,用瑞典圆弧法就较困难。瑞典费纶纽斯等人在瑞典圆弧法基础上,将滑动土体分成若干土条,计算各土条在滑面上产生的滑动力和抗滑力,再根据各土条总的抗滑力矩和滑动力矩之比,求得稳定系数。与瑞典圆弧法一样,也需要假定几个可能滑动面,求出最危险滑动面和土坡稳定系数。该种方法是目前国内、外广泛运用的方法之一。它假定各土条为一刚性不变形体,不考虑土条两侧面间的作用力。下面以一均质土坡为例说明其基本原理。
  设一简单均质土坡如图,取一假定圆心为O,半径为R和滑弧AC。其滑动土体沿铅直方向分成若干土条(常把土条分成 ∽ 宽),取其中第 i条进行受力分析。
  由于不考虑条间侧向作用力,则第i 土条作用在滑弧面上的力有:
  (1) 由土条自重W在滑弧上引起的切向力为
     
  式中γ、bi、hi 分别是第 i条土的容重、土条宽度和平均高度;
    αi为土条底面中心的法线(过圆心)与圆心O的铅直线间的夹角。注意,αi 在过圆心铅直线右侧取正值,左侧取负值。
  (2) 由土条自重Wi在滑弧面上引起的法向力所构成的抗滑阻力为
     
  (3)滑动时滑动面上土粘聚力形成抗滑力为
     
  式中c、li分别为滑面上第i条土的粘聚力和弧长。
  如果每个土条绕圆心O的总抗滑力矩和总滑动力矩相等,说明滑体处于极限平衡状态,故稳定系数可取个土条总抗滑力矩与总滑动力矩之比,表达式为
       
  若土体为均质体且取土条等宽,则上式可写成:
      
  若滑面经过的土层为非均质土,则稳定系数表达式为:
      
  上两式中 L -滑弧全长,L=(θ为滑弧圆心角)
  γi、ci、ji-分别为第i条土的容重、粘聚力和内摩擦角;
  其余符号同前。
  假定不同的滑弧,求出相应的Fs值,其中最小值为该土坡稳定系数。如它小于容许的Fs值(工程上Fs容许值为1.05-1.5),则认为土坡不稳定,要重新修改边坡尺寸,并按上述方法再重新试验土坡稳定性。
  为减少计算的盲目性和工作量,对均质土坡,多数情况下还可以按瑞典圆弧法找出危险滑弧圆心和求稳定系数。



德尔菲法的简介
我国习惯称德尔菲法为“专家预测法”,是美国兰德公司在50年代初与道格拉斯公司协作研究如何通过有控制的反馈使得收集专家意见更为可靠,以希腊历史遗址德尔菲为代号而得名的。

德尔菲法的要点是:

①不记名投寄征询意见。就预测内容写成若干条含义十分明确的问题,规定统一的评价方法,然后将这些问题邮寄给所选的有关专家,背对背地征询意见。

②统计归纳。收集各位专家的意见,然后对每个问题进行定量统计归纳。通常用回答的中位数反映专家的集体意见。

③沟通反馈意见。将统计归纳后的结果再反馈给专家,每个专家根据这个统计归纳的结果,慎重地考虑其他专家的意见,然后提出自己的意见。

然后,把收回的第二轮征询的意见,再进行统计归纳,再反馈给专家。如此多次反复,一般经过三、四轮,就可以取得较集中一致的意见。

用德尔菲法进行预测时应注意:

第一,问题必须十分清楚,其含义只能有一种解释。

第二,问题的数量不要太多,一般以回答者可在2小时内答完一轮为宜。要求专家们独自回答。

第三,要忠实于专家们的回答,调查者不得显露自己的倾向。

第四,对于不熟悉这一方法的专家,应事先讲清楚意义与方法。还应给专家们以适当的精神与物质的奖励。

决策者把德尔菲法当作技术预测的方法之一。

以上为斑竹HAPPY2003提供





 楼主| 发表于 2003-12-21 04:48:07 | 显示全部楼层
国际知名运筹管理专家于刚教授讲座
11月20日下午14:30,美国德州大学奥斯丁分校迈康管理学院于刚教授进行了关于“实时应急管理”的精彩讲座。
    于教授向到会的师生介绍了“实时应急管理系统”的概况、工作原理以及应用现状,并向大家展示了其广阔的应用前景。现场师生也向于教授请教了关于相关专业方面的问题,得到了于教授精彩的答复。整个讲座气氛轻松,于教授深入浅出的讲解将大家带进了一个全新发展的学科领域,讲座博得了在场师生的阵阵掌声。

于刚教授简介:
    于刚教授1982年毕业于武汉大学,获学士学位。同年,经李政道教授的CUSPEA项目赴美国留学。1985年获美国康奈尔大学硕士学位,1990年获宾夕法尼亚大学博士学位。1989年在德州奥斯汀大学任助理教授,1995年获终身教授,1999年任教授,2001年任冠名讲座教授。于93年在美国创立AdvanTech高技术资询公司并任总裁和总经理,于94年在美国创立科莱高科技公司并任总裁和董事长。科莱发展近千万美元年收入,近百名员工,多种产品,跨国的高科技决策支持软件公司,在国际上实时决策和航空管理领域处于领先地位。
    “9.11”事件的发生将实时应急管理推到了运筹学和管理科学的最前沿。事实上实时应急管理已在航空业获得巨大成功,于刚教授于2002年荣获国际管理科学应用的最高荣誉 —Franz Edelman 管理科学成就奖就说明了这一点,所开发的实时应急管理决策支持系统在 2001年为美国的Continental Airlines带来6000万美元的效益,并为“9.11”事件后的航班恢复起了决定性作用。

讲座笔记:
计划性决策要求:最优,可行,柔性,稳定
实时决策要求:1.迅速提供最优最近决策
              2.给决策者多解供实时参考
              3.当完全解不存在时必须提供部分解以保障运作的

连续性
              4.能解决所有可能发生的情况给考虑系统内相关的

各组成部分

对“实时决策支持系统”的要求:
1.以“What-if”分析为工具而加强决策者间的交流
2.用人机对话的方式为决策者提纲友好的界面以调节参数,限制决

策影响的范围和对象。

实例:航空实时应急决策支持系统
     航空系统:繁杂的计划
               稀少且偶合的资源
               政策及管理部门的约束
               工会条例
               大规模运营

“实时决策就是给定一个优化的计划,如何才能让它完美地实施”
“实时决策是相对于决策而言。它们有这样一些特征和区别:首先

,计划性决策的决策周期比较长,在实施前可以调整;实时决策时

间紧迫,如果出了问题不及时解决,就会触发更多的问题,更进一

步地扰动系统。其次,计划性决策是考虑了长期的多种因素的最优

计划;而实时决策一旦实施之后就不容易改变。例如,一旦通知乘

客航班取消了就不可能再作飞行。
“实时决策有很多新的要求,与计划性决策有很大的区别:第一,

对求解要求非常快,分秒必争。第二,需要多解。而计划性决策只

有一个解——最优解。在实施过程中有很多软因素、软成本、软约

束,加上许多软因素后很难说只有一个最优解。第三,不是任何时

候都有解。这时候决策就引出新的概念——部分解,即在资源不够

的时候,没有可行解时能够尽量解决问题、解决大部分问题、解决

紧急和重要问题。
“下面简单讲一下数学模型,计划决策中给定一个参数a,一个决

策变量x,在一个决策空间f里面求得最优的计划。比如总的价值最

大,系统干扰的情况下,参数发生变化,决策空间也随之改变。干

扰后的决策函数同以前相比就是一个新的函数,但是它有个起点,

这个起点就是计划决策的点。这样我们所求解的是一个新的综合目

标函数,包括以前的目标函数和受到干扰后所要考虑的因素,新的

问题变为一个新的决策空间之下有一个起点的、在一个变化的参数

之下的优化问题。可以说有很多新的思想把管理科学推进一大步,

包括部分解的思想、多解的思想、层次化的思想,我在这方面发表

的文章大概有20多篇(指图片),这是我的3个美国专利之一,也

是这个系统的基础。”

“美国大陆航空公司使用了我们的决策支持系统,‘9·11’后节

约了三千万美金”

“现在我用实例说明实时决策的重要性。美国东部出现暴风雪,整

个纽约机场关闭,成千上万的乘客受到影响。这件事在美国的影响

非常大,因为正赶上除夕夜,大家都赶飞机回家过新年。电视台的

摄像机镜头一直停留在这些被困于机场的乘客身上。美航、联航、

三角航空等至少3天后才能恢复航班,而大陆航空公司采用了我们

的决策支持系统,5分钟得到解,当天全部恢复正常,他们的所有

乘客都赶在新年之前回家。这次事件,因为应急决策系统的应用而

节约了五百余万美元。
“‘9·11’事发后,美国所有机场关闭三天,这是民航史上最大

的一次事件。在机场开放后,其他公司都是至少五天之后才能恢复

正常,损失巨大,是以亿美元为单位计算的。大陆航空公司使用我

们的实时决策系统,他们以20人/小时得到了完整方案,机场重新

开放,他们第一个在‘9·11’发生的那个星期就恢复了55%的航班

,仅此一项他们就节约了三千万美金。
“这是一个真实的事情,2001年登在《华尔街时报》。两个通讯公

司诺基亚和爱立信都从飞利浦供应商那里购买芯片。3月份飞利浦

发生了10分钟火灾,因灭火喷水造成了机器故障,整个生产线停下

来。这个问题延续了3个多星期,造成了半导体芯片的短缺。爱立

信采取等待的策略,而诺基亚开始考虑从别的供应商那里购买芯片

。就这样一个事件造成了怎样的影响?爱立信从座机市场退出,

2000年损失16.8亿美元,而且在对外公布这个事件时爱立信股票瞬

间下跌14%。计划再好,一旦遇到这样的事情,可以整个从一个市

场彻底退出。而诺基亚虽然受到一些损失,却因祸得福,从爱立信

那里赢得了3%的市场。
“应急管理不仅能够运用在航空业,现在很多行业都开始应用这种

管理方法,包括生产管理,比如机器出了故障、停电、工人生产,

还有供应链管理、通信管理、库存管理、项目管理等等。
“弗朗兹·艾德蒙管理科学成就奖已经有30年的历史,是管理科学

的最高荣誉,这个奖今年有30多个候选人。经过评选,到半决赛的

时候剩下16人,然后再进行非常严格的审查。主要有以下几个标准

:l. 给企业带来的效益;2. 给社会带来的效益;3. 对管理科学

的贡献。这一轮评审完后只剩下6组候选人参加5月19~21日在加拿

大蒙特利尔的总决赛。6组候选人中有美国的、法国的、德国的。

决赛进行3天。第一天是预演,要制成对外发行的录像。第二天正

式演讲。最后一天是获胜者在整个大会上进行演讲。有一段小插曲

:在我们演讲之后,虽然感觉不错,但竞争非常激烈,其他竞争者

的成就非常大,法国标志汽车制造厂所报的项目年成效达一亿多美

元。我们所报的效益只包括给企业带来的效益,还没有将对社会的

效益计算在内。事实上我们可以减少多少乘客在机场的等待,可以

让他们按时到达目的地去开会或见他们的亲友啊!虽然如此我们仍

没有把握。第二天晚上,规定了所有人都只能在宾馆里等待。到晚

上11点时派人叫我们,说有问题要问。于是,我们跟随着来到一个

很大的评审室。进去之后,看到所有的评委、世界级的专家,西装

革履,非常严肃,手都背在后面。然后主席对我说:‘我非常遗憾

地告诉你……’然后停顿下来,所有的人也都盯着我,顿时我的心

都凉了(笑声)。接着他说:‘你明天还得再讲一次!’他给我们

幽了一默。其他评委看到我们的表情都哈哈大笑起来,最后他们把

手从背后拿出来,原来每个人的手上都举着一杯香槟。那确实是非

常激动人心的时刻。
“美国大陆航空的董事长兼总裁和总经理说这是该公司有史以来IT

投资收效最大的一个项目。管理运筹学发行最广的杂志《OR/MS

TODAY》上面重点报道了这个项目。摘录了我说的这样一段话:运筹

和管理科学是整个这个系统成功的核心,假如这个系统只有一个数

据库和一个很好的界面,那么所能得到的效益只是运用管理科学的

思想和方法去解决问题所能够得到效益的很小的一部分。这就是管

理科学的将来,这就是管理科学的价值。” “很多管理问题可以

转化为数学问题”


于刚教授工作介绍
于刚教授七七年考入武汉大学空间物理系。八二年毕业前参加诺贝

尔奖获得者李政道先生举办的CUSPEA计划考试,以优异成绩进入美

国康奈尔大学物理系深造而从事理论物理研究。物理的思维方法给

他打下了深深的烙印。他曾有感悟:“复杂性是世界之妙,简单性

是宇宙之灵。简单性内有复杂性之质,复杂性中有简单性之本。”

由于他对应用科学的钟情,在他脑海里萦绕多时的想法终于促使他

拿到物理硕士后于八六年转到宾夕法尼亚大学的沃顿管理学院学运

筹和决策科学。三年寒暑,以该学院闯记录的速度拿到博士学位。
  八九年于刚教授到德州大学奥斯汀分校管理学院任助理教授,

他也是最早在该校任教的中国教授。九五年获终身教授,九九年任

教授,二零零一年任Jack G. Taylor Regents讲座教授。于九四年

任该校控制论研究中心副主任,九七年任物流运筹管理研究中心主

任。

于刚教授十多年来开创了实时运作管理新领域并成功地将其应用于

航空管理,又建立鲁棒优化的方法论,提出广义数据包络法。于刚

教授在国际一流学术杂志上发表过七十多篇文章并著书四部,其中

《Operations Research in the Airline Industry》在美国,德

国,英国的几所大学里被选为交通管理的教科书。于刚教授现担任

多个国际杂志编委包括Operations Research, Journal of

Combinatorial Optimization, IIE Transactions,

International Journal on Information Technology and

Decision Making, International Journal on System Science

and Complexity。他曾多次获得优秀研究奖、院长杰出贡献奖,

Trammell Crow Professorship 奖,海外杰出青年奖、最佳论文奖

等。他最近被提名到美国运筹管理联合会的Franz Edelman奖已进

入最后一轮(Finalist). 他曾组织过十多次国际会议, 在国际会议

上作过一百五十多次演讲。于刚教授指导并毕业了12名博士生。他

教授Executive MBA课程包括创业,商业谈判,供应链管理和研究

生课程包括优化,整数规划,算法设计与分析。他曾被多个学校邀

请教Executive MBA课程。

于刚教授主要研究方向集中在运筹学的理论和应用。理论研究的课

题主要从应用中产生并直接返回到应用中,有很高的实用价值。他

曾二十多次从美国政府机构和公司等获得过二百多万美元的研究基

金。于刚教授主持编写的决策支持系系统,每年为美国大型企业如

IBM等节约数千万美金。他当过十多家美国大公司的管理顾问,包

括IBM,EDS,Continental Airlines,Tracor Applied Sciences

,Ameritech,United Airlines,BNSF等。九四年于刚教授白手起

家创立了科莱科技公司并任总裁和董事长。几年来将科莱发展为近

千万美元年营业额、近百名员工、多种产品、跨国的高科技决策支

持软件公司,在国际实时决策和航空管理领域处于领先地位。科莱

的系统在数家美国航空公司运行包括Continental Airlines,

Northwest Airlines,Southwest Airlines,AirTran等,并每年

为这些公司创利上千万美元。他曾多次被美国杂志和报纸采访并受

邀为三个国际著名工业杂志拟文。他现获有三个美国专利。

于刚教授现任武汉大学、南京大学、西安交通大学、中国人民人学

、北京航空航天大学、香港中文大学的兼职教授。2000年他在武大

成立管理决策研究中心,今年又在中科院成立不确定情况下决策研

究中心,还受聘为天津市政府的经济顾问。他曾多次受中国政府,

大学,研究机构,和工企业邀请回国讲学。

于刚教授对运筹学的理论贡献主要在以下几个方面:

1.整数规划,图论,和网络规划: 于刚教授在这方面的贡献包括有

效建模,编写快速算法,算法分析,和发展大规模问题的有效解。

在有效建模方面,于刚教授的主要贡献在于:1)建立有效和正确的

整数规划,图论,和网络规划模型;2)对于整数规划问题,找到有

效的切割面和各种特殊目标函数的上下限;3)发展快速精确求解算

法和多项式算法;4)提出近似有效算法,并分析各算法的复杂性和

近似精度。于刚教授对算法发展的主要贡献在于:1)定义新的算法

效率测度,并在此测度下找到算法新的性质。2)改进了几个重要图

论问题的算法。3)提出并定义了几个新的图论和组合优化问题。给

出其算法并作出算法分析。4)利用特殊图论和组合优化问题的特殊

性质,找到其独特而有效的算法。

2.Robust 优化: 于刚教授于1992年首次提出一种新的Robust优化

概念和定义。于刚教授定义了在数据和参数不确定情况下三种测量

决策好坏和稳定性的准则并在中将其系统化和定量化。其后,于刚

教授将此定义运用在生产计划,调度,选程,选址和任务分配等问

题中并取得显著成果。于刚教授两次被邀请作大会报告介绍这方面

进展和方向,并与 Kouvelis合著一书《Robust Optimization and

Its Industrial Applications》。

3.数据包络分析法(DEA): 于刚教授在数据包络分析法领域的主

要贡献如下:1)首次将六个经典的DEA模型用参数归纳成一个总的

模型,称为GDEA。2)提出新的DEA方法描述效益的规模变化。3)

提出位移锥的方法更好地表达DEA效率。4)应用DEA和分辨函数法

求解经验生产函数。计算数据结果显示此方法比所有现有的方法都

优越。5)研究在数据不确定情况下的DEA模型。

  

于刚教授对运筹学的应用贡献主要在以下几个方面:

1.航空业的应用: 90年代初,在于刚教授领导下的研究小组对实时

运行控制问题进行研究。在此基础上,他们对民航业中航班晚点或

取消时机组人员和飞机重新调度问题建立了优化模型,并为美国联

合航空公司(联航)编写决策支持系统。此系统从92年起在联航开始

运行,每年为联航节约一千多万美金。1994年,美国航空公司(美

航)开始资助于刚教授和他领导的小组展开对几个问题的研究包括

Air Traffic Control问题和Ground Delay问题。 自95年来,美国

大陆航空公司(陆航)资助了于刚教授和他领导的小组的三个项目。

在研究基础上,于刚教授等为陆航编写了三个决策支持系统。每个

决策支持系统都为陆航每年节约一千多万美元,并显著提高了陆航

的正点率和服务质量。在此系统的协助下,陆航近年来多次被J.D

.Power评选为最佳航空公司。九·一一恐怖事件,陆航用于刚教授

开发的系统以创纪录的速度恢复航班并节约几千万美元,被

Information Week树为民航界的典范。

2.其它工业界的应用: 于刚教授曾为多个美国Fortune 500公司任

顾问,并获得其研究基金。于刚教授为IBM开发的印刷电路板的测

试系统的最佳设计决策支持系统从93年起在IBM各生产线上启用。

为其研究的多产品生产线中的最佳产品组合问题解决了IBM的瓶颈

问题,并将其Austin生产线的生产能力大为提高。1995年Tracor

Applied Sciences资助于刚教授研究未来国防交通系统。1996年

EDS资助于刚教授研究交通实时控制问题。于刚教授的书《

Industrial Applications of Combinatorial Optimization》概

括了组合优化的多种工业界的应用。

3.军队中的应用: 于刚教授从美国海军研究部两次获得研究基金。

主要课题是为海军征兵,培训和任务分配制定最优方案。于刚教授

用混合整数规划建模求解得出的新方案每年可帮美国海军节约一千

多万美元,并显著减少征兵过程中人员流失和缩短培训时间。美国

陆军研究部多年来一直资助于刚教授和其领导的研究中心。课题为

陆军征兵的预测及最佳资源分配。于刚教授等作出的预测模型使预

测精确度从以前的88%提高到96%。

  

由于于刚教授的杰出工作,他曾获得多项奖励和荣誉,包括:

Faculty Research Assignment (FRA), The University of Texas

at Austin, 2001
Research Excellence Award, The University of Texas at

Austin, 2001
Outstanding Young Scientist Award, National Science

Foundation of China, 1999
Deans' Fellow, 1998
Trammell Crow Regents Professorship in Business, 1998 -
College of Business Administration Advisory Council

Centennial Fellowship, 1997 -
CBA Foundation Research Excellence Award for Assistant

Professors, 1995
Distinguished Scholar Award, National Natural Science

Foundation of China, 1993
Hartman Scholarship Award, Cornell University, 1984
Award for Academic Excellence, Wuhan University, 1978,
1979, 1980, 1981  





[此贴子已经被彗星于2003-12-28 18:06:53编辑过]

 楼主| 发表于 2003-12-21 04:50:57 | 显示全部楼层
小程序Calculater2.0
本人刚做的一个小程序的源代码(在C++Builder6.0中编译)
/*   
                        Graph.h
*/
#include <vector>
#include <complex>
#ifndef _GRAPH_H_
#define _GRAPH_H_

using namespace std;

class Arcc
{
  public:
    Arcc(double r,double c,double l,int i,int j):R(r),C(c),L(l),To1(i),To2(j)
    {}
    Arcc():R(0),C(0),L(0),To1(-1),To2(-1)
    {}
    double R;
    double C;
    double L;
    int To1;
    int To2;
};

class Graph
{
  public:
    Graph(int,bool);
    void AddArcc(Arcc);
    std::complex<double> CaculateImage(double);
    vector<double> CalculateFrequency();
    void SetDelta(double d)
    {
          Delta=d;
    }
    double dF(double w);
    double d2F(double w);
    double d3F(double w);
    bool Judge()
    {
          return JJ;
    }
    vector<complex<double> > Gauss(vector<vector<complex<double> > > A,vector<complex<double> > B);
  protected:
    std::vector<std::vector<int> > Node;//存节点信息的矩阵
    std::vector<Arcc> Arcct;//存边信息的向量
    bool JJ;
    bool output;
    double Delta;
};

Graph::Graph(int i,bool o):Node(i),JJ(false),output(o)
{
      for(int k=0;k<i;++k)
      {
            Node[k].push_back(0);
            Node[k].push_back(k);
      }
}

void Graph::AddArcc(Arcc a)
{
     Arcct.push_back(a);
     ++Node[a.To1][0];
     ++Node[a.To2][0];
}

vector<complex<double> > Graph::Gauss(vector<vector<complex<double> > > A,vector<complex<double> > B)
{
     for(int k=0;k<(int)A.size();++k)
     {
            int g=k;
            for(int i=k;i<(int)A.size();++i)
            {
                  if(abs(A[k])>abs(A[g][k]))
                  {
                        g=i;
                  }
            }
            for(int i=0;i<(int)A.size();++i)
            {
                  complex<double> temp=A[k];
                  A[k]=A[g];
                  A[g]=temp;
            }
            complex<double> temp=B[k];
            B[k]=B[g];
            B[g]=temp;
            if(abs(A[k][k])!=0)
            {
                  complex<double> x=A[k][k];
                  for(int i=0;i<(int)A.size();++i)
                  {
                         A[k]=(A[k]/x);
                  }
                  B[k]=(B[k]/x);
                  for(int i=0;i<(int)A.size();++i)
                  {
                         if(i!=k)
                         {
                               x=A[k];
                               for(int j=0;j<(int)A.size();++j)
                               {
                                       A[j]=A[j]-A[k][j]*x/A[k][k];
                               }
                               B=(B-((B[k]*x)/A[k][k]));
                         }
                  }
            }
     }
     return B;
}

complex<double> Graph::CaculateImage(double w)
{
     vector<vector<int> > node(Node);    //节点转存
     vector<complex<double> > data;  //边权转存
     vector<Arcc> AA(Arcct);  //边转存
     for(int i=0;i<(int)AA.size();++i)
     {
          complex<double> rr(AA.R,0);
          complex<double> ll(0,w*(AA.L));
          if(w*AA.C!=0)
          {
               complex<double> cc(0,AA.C*w);
               data.push_back(rr+ll+1.0/cc);
          }
          else
          {
               data.push_back(rr+ll);
          }
     }
     for(int i=0;i<(int)data.size();++i)
     {
          if(abs(data)==0)
          {
               if(!(((AA.To1==1)&&(AA.To2==0))||((AA.To1==0)&&(AA.To2==1))))
               {
                     int d;
                     vector<complex<double> > :: iterator it1=data.begin();
                     vector<Arcc> :: iterator it2=AA.begin();
                     for(;it1!=data.end();++it1,++it2)
                     {
                            if(((it2->To1==AA.To1)&&(it2->To2==AA.To2))||((it2->To2==AA.To1)&&(it2->To1==AA.To2)))
                            {
                                    it1=data.erase(it1)-1;
                                    it2=AA.erase(it2)-1;
                            }
                     }
                     if(AA.To1>AA.To2)
                     {
                            d=AA.To2;
                            vector<std::vector<int> >:: iterator it3;
                            for(it3=node.begin();it3!=node.end();++it3)
                            {
                                   if((*it3)[1]==AA.To1)
                                   {
                                          it3=node.erase(it3);
                                   }
                                   if((*it3)[1]>AA.To1)
                                   {
                                          --(*it3)[1];
                                   }
                            }
                            for(int k=0;k<(int)data.size();++k)
                            {
                                   if(AA[k].To1==AA.To1)
                                   {
                                          AA[k].To1=d;
                                   }
                                   if(AA[k].To2==AA.To1)
                                   {
                                          AA[k].To2=d;
                                   }
                                   if(AA[k].To1>AA.To1)
                                   {
                                          --AA[k].To1;
                                   }
                                   if(AA[k].To2>AA.To1)
                                   {
                                          --AA[k].To2;
                                   }
                            }
                     }else
                     {
                            d=AA.To1;
                            vector<std::vector<int> >:: iterator it3;
                            for(it3=node.begin();it3!=node.end();++it3)
                            {
                                   if((*it3)[1]==AA.To2)
                                   {
                                         it3=node.erase(it3);
                                   }
                                   if((*it3)[1]>AA.To2)
                                   {
                                         --(*it3)[1];
                                   }
                            }
                            for(int k=0;k<(int)data.size();++k)
                            {
                                   if(AA[k].To1==AA.To2)
                                   {
                                         AA[k].To1=d;
                                   }
                                   if(AA[k].To2==AA.To2)
                                   {
                                         AA[k].To2=d;
                                   }
                                   if(AA[k].To1>AA.To2)
                                   {
                                         --AA[k].To1;
                                   }
                                   if(AA[k].To2>AA.To2)
                                   {
                                         --AA[k].To2;
                                   }
                            }
                     }
               }
          }
     }
     complex<double> zero(0,0);
     complex<double> one(1.0,0);
     vector<vector<complex<double> > > A(node.size()-2);
     vector<complex<double> > B(A.size(),zero);
     for(int i=0;i<(int)A.size();++i)
     for(int j=0;j<(int)A.size();++j)
     {
          A.push_back(zero);
     }
     vector<Arcc> :: iterator it1=AA.begin();
     vector<complex<double> > :: iterator it3=data.begin();
     complex<double> out(0,0);
     int kk(0);
     int kt(0);
     for(int i=0;i<(int)data.size();++i,++it1,++it3)
     {
          if(((it1->To1==1)&&(it1->To2==0))||((it1->To2==1)&&(it1->To1==0)))
          {
               it1=AA.erase(it1)-1;
               if(abs(data)!=0)
               {
                     out=out+(1.0/data);
                     ++kk;
               }
               else
               {
                     ++kt;
               }
               it3=data.erase(it3)-1;

          }
     }
     if(kk!=0)
     {
          out=(1.0/out);
     }
     for(int i=0;i<(int)data.size();++i)
     {
          if((AA.To1==0)||(AA.To2==0))
          {
               if(AA.To1==0)
               {
                     A[AA.To2-2][AA.To2-2]=A[AA.To2-2][AA.To2-2]-(1.0/data);
               }else
               {
                     A[AA.To1-2][AA.To1-2]=A[AA.To1-2][AA.To1-2]-(1.0/data);
               }
          }else if((AA.To1==1)||(AA.To2==1))
          {
               if(AA.To1==1)
               {
                     A[AA.To2-2][AA.To2-2]=A[AA.To2-2][AA.To2-2]-(1.0/data);
                     B[AA.To2-2]=B[AA.To2-2]-(one/data);
               }else
               {
                     A[AA.To1-2][AA.To1-2]=A[AA.To1-2][AA.To1-2]-(1.0/data);
                     B[AA.To1-2]=B[AA.To1-2]-(one/data);
               }
          }else
          {
               A[AA.To2-2][AA.To2-2]=A[AA.To2-2][AA.To2-2]-(1.0/data);
               A[AA.To2-2][AA.To1-2]=A[AA.To2-2][AA.To1-2]+(1.0/data);

               A[AA.To1-2][AA.To1-2]=A[AA.To1-2][AA.To1-2]-(1.0/data);
               A[AA.To1-2][AA.To2-2]=A[AA.To1-2][AA.To2-2]+(1.0/data);
          }
     }
     vector<complex<double> > U(Gauss(A,B));
     complex<double> line(0,0);
     for(int i=0;i<(int)data.size();++i)
     {
          if((AA.To1==1)||(AA.To2==1))
          {
               if(AA.To1==1)
               {
                     line+=((one-U[AA.To2-2])/data);
               }else
               {
                     line+=((one-U[AA.To1-2])/data);
               }
          }
     }
     if(output==false)
     {
          if(kt!=0)
          {
               out=(one/line);
          }else if(kk!=0)
          {
               out=(one/line)+out;
          }
     }else
     {
          if(kk!=0)
          {
               out=(1.0/((line/one)+(1.0)/out));
          }else
          {
               out=(one/line);
          }
     }
     return out;
}

double Graph::dF(double w)
{
     double delta=0.0000000000001;
     complex<double> data=CaculateImage(w);
     complex<double> data0=CaculateImage(w-delta);
     complex<double> data1=CaculateImage(w+delta);
     double x1=(data.imag()-data0.imag())/delta;
     double x2=(data1.imag()-data.imag())/delta;
     return (x1+x2)/2;
}

double Graph::d2F(double w)
{
     double delta=0.0000000000001;
     double data0=dF(w-delta);
     double data=dF(w);
     double data1=dF(w+delta);
     double x0=(data-data0)/delta;
     double x1=(data1-data)/delta;
     return (x0+x1)/2;
}

double Graph::d3F(double w)
{
     double delta=0.0000000000001;
     double data0=d2F(w-delta);
     double data=d2F(w);
     double data1=d2F(w+delta);
     double x0=(data-data0)/delta;
     double x1=(data1-data)/delta;
     return (x0+x1)/2;
}

vector<double> Graph::CalculateFrequency()
{
     JJ=false;
     vector<double> result;
     double Delta1(1000000);
     complex<double> data0=CaculateImage(0);
     double x2(Delta1);
     double x3(0-Delta1);
     complex<double> data2=CaculateImage(x2);
     complex<double> data3=CaculateImage(x3);
     while((data0.imag()*data2.imag()>0)&&(data0.imag()*data3.imag()>0))
     {
          x2+=Delta1;
          x3-=Delta1;
          data2=CaculateImage(x2);
          data3=CaculateImage(x3);
     }
     if(data0.imag()*data3.imag()<=0)
     {
          JJ=true;
     }
     while(data0.imag()*data2.imag()>0)
     {
          x2+=Delta1;
          data2=CaculateImage(x2);
     }
     x3=x2-Delta1;
     while(fabs(x2-x3)>Delta)
     {
          data3=CaculateImage((x2+x3)/2);
          if(data3.imag()*data2.imag()>0)
          {
                x2=(x2+x3)/2;
          }
          else
          {
                x3=(x2+x3)/2;
          }
     }
     result.push_back((x2+x3)/2);
     if(JJ==false)
     {
          x2=x3;
          data2=CaculateImage(x2);
          data3=CaculateImage(x3);
          while(!((data2.imag()*data3.imag()<=0)||(d2F(x3)*(data3.imag()>=0))||(d3F(x3)*(data3.imag()>=0))))
          {
                x3+=Delta1;
          }
          if(data2.imag()*data3.imag()<=0)
          {
                x2=x3-Delta1;
                while(fabs(x2-x3)>Delta)
                {
                       data2=CaculateImage(x3);
                       data3=CaculateImage((x2+x3)/2);
                       if(data3.imag()*data2.imag()>0)
                       {
                               x3=(x2+x3)/2;
                       }
                       else
                       {
                               x2=(x2+x3)/2;
                       }
                }
                result.push_back((x3+x2)/2);
                JJ=true;
          }
     }
     return result;
}

#endif


 楼主| 发表于 2003-12-21 04:52:29 | 显示全部楼层
/*
                     Main.cpp
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#include <complex>
#include <fstream>
#include <process.h>
#include <vector>
#include "Graph.h"
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
using namespace std;
TMainForm *MainForm;
Graph *g=NULL;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
        Run->Enabled=false;
        Button3->Enabled=true;
        RadioButton2->Checked=true;
}
//----------------------------------------------------------------------------

void __fastcall TMainForm::Button1Click(TObject *Sender)
{
       if((NodeNum->Text!="")&&(g==NULL))
       {
              if(CheckBox1->Checked==true)
              {
                    g=new Graph(NodeNum->Text.ToInt(),true);
              }else
              {
                    g=new Graph(NodeNum->Text.ToInt(),false);
              }
              Button1->Enabled=false;
              CheckBox1->Enabled=false;
              ofstream out("data.txt");
              out<<"电路图中有"<<NodeNum->Text.ToInt()<<"个节点。"<<endl;
              if(CheckBox1->Checked==true)
              {
                    out<<"为二端口电路,节点0和节点1为端口。"<<endl;
              }
              out<<"--------------------------------------------------"<<endl;
              out<<"R(Ω)\tC(F)\tL(H)\tFrom(No.)\tTo(No.)"<<endl;
              AnsiString s1("电路中节点数已经设定好了!请向电路中添加数据!\n");
              AnsiString s2("电路中节点编号从0到");
              AnsiString s3(NodeNum->Text.ToInt()-1);
              MessageDlg(s1+s2+s3,mtInformation,TMsgDlgButtons() << mbOK, 0);
              NodeNum->ReadOnly=true;
              NodeNum->Color=cl3DLight;
       }else if(NodeNum->Text=="")
       {
              MessageDlg("请输入节点中的节点数!",mtInformation,TMsgDlgButtons() << mbOK, 0);
       }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::AddClick(TObject *Sender)
{
       if((Begin->Text.ToDouble()>=NodeNum->Text.ToDouble())||(End->Text.ToDouble()>=NodeNum->Text.ToDouble())||(Begin->Text.ToDouble()<0)||(End->Text.ToDouble()<0))
       {
              MessageDlg("您所添加的该边的两个端点中有非该图中的节点!",mtError,TMsgDlgButtons() << mbOK, 0);
       }else if(Begin->Text==""||End->Text==""||R->Text==""||L->Text==""||C->Text=="")
       {
              MessageDlg("输入错误!输入数据不可以为空!",mtError,TMsgDlgButtons() << mbOK, 0);
       }else if(Begin->Text.ToDouble()==End->Text.ToDouble())
       {
              MessageDlg("边的起点和终点不可以相同!",mtError,TMsgDlgButtons() << mbOK, 0);
       }
       else if(g)
       {
              Arcc aa(R->Text.ToDouble(),C->Text.ToDouble(),L->Text.ToDouble(),Begin->Text.ToInt(),End->Text.ToInt()) ;
              g->AddArcc(aa);
              ofstream out("data.txt",std::ios:ut|std::ios::app);
              out<<R->Text.ToDouble()<<"\t"<<C->Text.ToDouble()<<"\t"<<L->Text.ToDouble()<<"\t"<<Begin->Text.ToInt()<<"\t\t"<<End->Text.ToInt()<<endl;
              MessageDlg("数据已经添加进去了,请继续添加数据!",mtInformation,TMsgDlgButtons() << mbOK, 0);
              R->Text="";
              C->Text="";
              L->Text="";
              Begin->Text="";
              End->Text="";
       }else if(!g)
       {
              MessageDlg("请先确定图中节点的个数!",mtError,TMsgDlgButtons() << mbOK, 0);
       }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::Button3Click(TObject *Sender)
{
       if(Result->Text=="")
       {
              MessageDlg("请输入频率!",mtError,TMsgDlgButtons() << mbOK, 0);
       }
       else if(g)
       {
              complex<double> dd(g->CaculateImage(Result->Text.ToDouble()));
              AnsiString s1(dd.real());
              AnsiString s3(dd.imag());
              AnsiString s2("+");
              AnsiString s4("i");
              if(dd.imag()>=0)
              {
                     ww->Text=s1+s2+s3+s4;
              }else if(dd.imag()<0)
              {
                     ww->Text=s1+s3+s4;
              }
              MessageDlg("计算完成!",mtInformation,TMsgDlgButtons() << mbOK, 0);
       }
       else
       {
              MessageDlg("请先输入图中信息!",mtError,TMsgDlgButtons() << mbOK, 0);
       }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::close(TObject *Sender, TCloseAction &Action)
{
       if(g)
       {
              delete g;
       }
       MessageDlg(" 谢谢使用!\n开发者:倪冉\nKnight-Studio",mtInformation,TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
       MessageDlg("欢迎使用电路Calculater2.0!\n开发者:倪冉\nKnight-Studio",mtInformation,TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::RadioButton1Click(TObject *Sender)
{
       if(RadioButton1->Checked==true)
       {
              Run->Enabled=true;
              Button3->Enabled=false;
              ww->Color=cl3DLight;
              ww->ReadOnly=true;
              delta->ReadOnly=false;
              delta->Color=clWindow;
              Button4->Enabled=true;
              Button5->Enabled=true;
       }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::RadioButton2Click(TObject *Sender)
{
       if(RadioButton2->Checked==true)
       {
              Run->Enabled=false;
              Button3->Enabled=true;
              ww->ReadOnly=false;
              ww->Color=clWindow;
              delta->ReadOnly=true;
              delta->Color=cl3DLight;
              Button4->Enabled=false;
              Button5->Enabled=false;
       }
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::Button2Click(TObject *Sender)
{
       if(g)
       {
               delete g;
               g=NULL;
               NodeNum->ReadOnly=false;
               NodeNum->Color=clWindow;
               NodeNum->Text="";
               Button1->Enabled=true;
               CheckBox1->Enabled=true;
               Button4->Enabled=true;
               Run->Enabled=false;
               Button3->Enabled=true;
               RadioButton2->Checked=true;
               delta->Text="";
       }

}
//---------------------------------------------------------------------------

void __fastcall TMainForm::RunClick(TObject *Sender)
{
       if(g)
       {
              vector<double> data=g->CalculateFrequency();
              //Result->Text=g->CalculateFrequency();
              if((g->Judge())&&(data.size()==1))
              {
                      Result->Text=data[0];
                      MessageDlg("该解为唯一正解!",mtInformation,TMsgDlgButtons()<<mbOK,0);
              }
              else if((g->Judge())&&(data.size()==2))
              {
                      AnsiString s1(data[0]);
                      AnsiString s3(data[2]);
                      AnsiString s2("OR");
                      Result->Text=s1+s2+s3;
                      MessageDlg("存在两个可以求出的正解!",mtInformation,TMsgDlgButtons()<<mbOK,0);
              }
              else
              {
                      Result->Text=data[0];
                      MessageDlg("该解为一个正解,可能还有其他的正解,不能确定!",mtInformation,TMsgDlgButtons()<<mbOK,0);
              }
       }
       else
       {
              MessageDlg("请先输入电路图中的信息!",mtError,TMsgDlgButtons()<<mbOK,0);
       }
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::Button4Click(TObject *Sender)
{
       if(g)
       {
              g->SetDelta(delta->Text.ToDouble());
              delta->ReadOnly=true;
              delta->Color=cl3DLight;
              Button4->Enabled=false;
       }
       else
       {
              MessageDlg("请先输入电路图中的信息!",mtError,TMsgDlgButtons()<<mbOK,0);
       }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::Button5Click(TObject *Sender)
{
       delta->ReadOnly=false;
       delta->Color=clWindow;
       delta->Text="";
       Button4->Enabled=true;
}
//---------------------------------------------------------------------------

/*
              main.h
*/
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <sysutils.hpp>
#include <windows.hpp>
#include <messages.hpp>
#include <sysutils.hpp>
#include <classes.hpp>
#include <graphics.hpp>
#include <controls.hpp>
#include <forms.hpp>
#include <dialogs.hpp>
#include <stdctrls.hpp>
#include <buttons.hpp>
#include <extctrls.hpp>
#include <menus.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Buttons.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:
        TGroupBox *GroupBox1;
        TEdit *NodeNum;
        TLabel *Label1;
        TGroupBox *GroupBox2;
        TLabel *Label2;
        TEdit *Begin;
        TLabel *Label3;
        TEdit *End;
        TLabel *Label4;
        TEdit *R;
        TLabel *Label5;
        TLabel *Label6;
        TButton *Button1;
        TEdit *C;
        TLabel *Label8;
        TEdit *L;
        TLabel *Label9;
        TButton *Add;
        TGroupBox *GroupBox3;
        TLabel *Label10;
        TEdit *Result;
        TButton *Run;
        TLabel *Label7;
        TEdit *ww;
        TButton *Button3;
        TLabel *Label11;
        TGroupBox *GroupBox4;
        TRadioButton *RadioButton1;
        TRadioButton *RadioButton2;
        TLabel *Label12;
        TButton *Button2;
        TGroupBox *GroupBox5;
        TLabel *Label13;
        TEdit *delta;
        TButton *Button4;
        TButton *Button5;
        TCheckBox *CheckBox1;
        TLabel *Label14;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall AddClick(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall close(TObject *Sender, TCloseAction &Action);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall RadioButton1Click(TObject *Sender);
        void __fastcall RadioButton2Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall RunClick(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall Button5Click(TObject *Sender);

private:        // private user declarations
public:         // public user declarations
virtual __fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
/*
                        Calculter2.0.cpp
*/
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Main.cpp", MainForm);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TMainForm), &MainForm);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}
//---------------------------------------------------------------------------
以上为2002年高社杯获得者knight提供

发表于 2003-12-23 03:25:06 | 显示全部楼层
太好了
这有我想要的!
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 15:51 , Processed in 0.086262 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表