计算方法-积分方程

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

(9.2.7)
• 称为梯形方法.
• 梯形方法是隐式单步法,可用迭代法求解.同后退的欧拉方法一样,仍 用欧拉方法提供迭代初值,则梯形法的迭代公式为


(9.2.8)
• 为了分析迭代过程的收敛性,将(9.2.7)式与(9.2.8)相减,得


• 于是有
•,
• 式中L为对 满足Lipschitz常数,如果选取பைடு நூலகம்充分小,使得
• 所谓数值解法,就是寻求 y(x)在一系列离散节点

• 上的近似值 果不特别说明,总是假定
。相邻两个结点的间距
称为步长。今后如
为定数,这时节点为

• 初值问题(9.1.1),(9.1.2)的数值解法有个基本特点,
它们都采用取“步进式”,即求解过程顺着节点
的次序一步一步地向前推进。描述这类算法,只

经过上三次的编写程序之后我们对各自的编程的特点和基本思路
有了一个清晰的了解,大家在交流的时候也是明显的速度加快了许多,
同时对微分的认识也是加强了很多。对于这次的编程我们组提出了也
尽量做到时间和空间也精确读的最优化。于是大家在课下不仅仅是对
课本上的思想在程序经行了实现,而且在实现之后大家相互的交流之
测试代码
• #include<iostream> • #include<string> • #include <limits> • using namespace std;
• int main() •{ • cout << "type: \t\t" << "************size**************"<< endl; • cout << "bool: \t\t" << "所占字节数:" << sizeof(bool); • cout << "\t最大值:" << (numeric_limits<bool>::max)(); • cout << "\t\t最小值:" << (numeric_limits<bool>::min)() << endl; • ……………… • return 0; •}
• 如果在(9.2.4)中右端积分用右矩形公式
近似,则得另一个公式

(9.2.5)
• 称为后退的欧拉法.

3、Crank-Nicholson
• 为得到比欧拉法精度高的计算公式,在等式(9.2.4)右端积分中若用梯形 求积公式近似,并用yn代替y(Xn),y(n+1)代替y(X(n+1)),则得
•,
目录
• 一、 引言…………………………………… 3 • 二、 算法描述……………………………… 4 • 三、 试验及分析…………………………… 7 • 四、 自己的特色…………………………… 9 • 五、 总结…………………………………… 12 • 六、 程序清单……………………………… 13 •
一、引言
六、程序清单
• 见文库文本文件“计算方法-积分方程”。
• 这是通过三种平台进行的测试从而很好的为我们的编写程序需要的精度 经行了估计,其中我们不能发现其中有很多值是有区别的,比如long double的值在不同的平台上是不一样的这是因为。ANSI C标准规定了 double变量存储为 IEEE 64 位(8 个字节)浮点数值,但并未规定long double的确切精度。所以对于不同平台可能有不同的实现。这样在 VC6.0上面的测试数据为第一个,可以看到最精确的应该为double。
1、Euler method
• 我们知道,在XY平面上,微分方程(1.1)的解
称作它的积分曲
线。积分曲线上一点 的切线斜率等于函数
的值,如果按
函数
在XY平面上建立一个方向场,那么,积分曲线上每一点
的切线方向均与方向场在该点的方向相一致。
• 基于上述几何解释,我们从初始点
出发,先依方向场在该点
的方向推进
对它校正一次,即迭代一次,求得y(n+1),称为
校正值。即得到改进的Euler公式:
• • 可以证明该公式的精度是二阶,这是一种显示方

• 实例: • 为改进:
改进后 从误差的分析看来截距误差减小了
五、总结
• 这次大家通过交流学到了很多,我将从以下几点经行说明
• 1、大家对算法经行了细致的研究
• 3、改进了Euler公式

显示欧拉公式计算工作量小,但精度低。
向后欧拉法、Crank-Nicholson方法虽提高了精
度,但为隐式公式,需用迭代法求解,计算工作
量大。综合两者便可改进Euler公式。 先用Euler
公式求出一个初步的近似值 一y(n+1),称为预测
值,它的精度不高,再用Crank-Nicholson公式
• 1、对算法经行了多个区间的比较并且分 析误差原因、
• 通过上面三个区间的比较之后我们发现在算法的区间在增大以后, 其误差会变的很大,经过我们组内的讨论,发现其函数的原函数 为一个指数函数为 exp(1.0*t*t*t/3.0);所以在增大区间的时候会出现 很大的误差。
• 2、对精度进行研究
• 科学技术中常常要求解常微分方程的定解问题。这类问题最简单的形式是本章将要着 重考察的一阶方程的初值问题

• • 我们知道,只要函数 • •
适当光滑,譬如关于满足Lipschitz条件 (9.1.3)
• 理论上就可以保证初值问题(9.1.1),(9.1.2)的解
存在并且唯一。
• 虽然求解常微分方程有各种各样的解析方法,但解析方法只能用来求解一些特殊类型 的方程,实际问题中归结出来的微分方程主要靠数值解法。
后,对算法的时间空间上面进行了优化,在这其中大家试着去做到如
何精确,做了许多超出课本上要就的测试,得出为什么越大误差会很
大,并且探求出是函数的原因。其次,有的同学提出了对经行两次运
算从而更加精确的确定其微分的值。大家除了课本从算法的优化和对
积分的认识上面有了很大的提高。
• 2、大家积极的参与到后期的报告活动中
到上一点P1,然后再从P1依方向场的方向推进

上一点P2,循此前进推出一条折线
(图9.1)。
• 一般地,设已做出该折线的顶点Pn,过
依方向场的方向再
推进到
,显然两个顶点Pn,P(n+1)的坐标有关系
•即

(9.2.1)
• 这就是著名的欧拉(Euler)公式。若初值已知,则依公式
(9.2.1)可逐步算出
• 在这次中,大家表现出前所未有的热情,争先 恐后的去做报告PPT等任务,力求做的最好。在 即上三次的分工之后,我们这次决定再次相互的 交换一下工作。我们最终的程序或许没有解决我 们最初讨论出的问题,但是我想大家参与了就是 一种最大的收获。这次的分工是:由四位同学负 责修改程序,王男经行程序的测试和算法的描述 工作,彭、正写word文档,张、鹏负责制作PPT , 肖、旭写台上的细化工作。
的前提下,
于是可得到欧拉法(9.2.1)的公式

, (9.2.3)
• 称为此方法的局部截断误差。
• 如果对方程(9.1.1)从Xn到X(n+1)积分,得
•.
(9.2.4)
• 右端积分用左矩形公式
近似,再yn以代替y(Xn),y(n+1)代替
y(X(n+1))也得到(9.2.1),局部截断误差也是(9.2.3).


• 则当
时有
,这说明迭代过程(9.2.8)是收敛的.

三、实验及分析
• 一:测试例子

dy dx
x2 y
y(0) 1
• 设置长h=0.1,步数n=10。 • 运行环境:VC++6.0
1、Euler method
2、Backward Euler
3、Crank-Nicholson
四、自己的特色
要给出用已知信息
计算

递推公式。
• 首先,要对方程(9.1.1)离散化,建立求数值解的
递推公式。一类是计算 时只用到前一点的
值 ,称为单步法。另一类是用到 前面K
点的值
称为K步法。其次,要研究公式
的局部截断误差和阶,数值解 与精确解
的误差估计及收敛性,还有递推公式的计算稳定
性等问题。
二、算法描述



2、Backward Euler

假设
,即顶点 Pn落在积分曲线
上,那么,按欧拉方
法做出的折线PnP(n+1)便是过点Pn的切线,从图形上看,这样定出的顶点
P(n+1)明显地偏离了原来的积分曲线,可见欧拉方法是相当粗糙的。
• 为了分析计算公式的精度,通常可用泰勒展开将
在Xn处展开,则有
•在 误差
相关文档
最新文档