差分约束----原理其实很简单

好文章就是让初学者一看就知道原理和实现

一直不知道差分约束是什么类型题目,最近在写最短路问题就顺带看了下,原来就是给出一些形如x-y<=b不等式的约束,问你是否满足有解的问题

好神奇的是这类问题竟然可以转换成图论里的最短路径问题,下面开始详细介绍下

比如给出三个不等式,b-a<=k1,c-b<=k2,c-a<=k3,求出c-a的最大值,我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权,如图

由题我们可以得知,这个有向图中,由题b-a<=k1,c-b<=k2,得出c-a<=k1+k2,因此比较k1+k2和k3的大小,求出最小的就是c-a的最大值了

根据以上的解法,我们可能会猜到求解过程实际就是求从a到c的最短路径,没错的....简单的说就是从a到c沿着某条路径后把所有权值和k求出就是c -a<=k的一个

推广的不等式约束,既然这样,满足题目的肯定是最小的k,也就是从a到c最短距离...

理解了这里之后,想做题还是比较有困难的,因为题目需要变形一下,不能单纯的算..

首先以poj3159为例,这个比较简单,就是给出两个点的最大差,然后让你求1到n的最大差,直接建图后用bellman或者spfa就可以过了

稍微难点的就是poj1364,因为他给出的不等式不是x-y<=k形式,有时候是大于号,这样需要我们去变形一下,并且给出的还是>,<没有等于,都要变形

再有就是poj1201,他要求出的是最长距离,那就要把形式变换成x-y>=k的标准形式

注意点:

1. 如果要求最大值想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意x-y<k =>x-y<=k-1

   如果要求最小值的话,变为x-y>=k的标准形式,然后建立一条从y到x的k边,求出最长路径即可

2.如果权值为正,用dj,spfa,bellman都可以,如果为负不能用dj,并且需要判断是否有负环,有的话就不存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Crank-Nicolson差分格式是一种常用的数值方法,用于求解偏微分方程的数值解。实际应用中,很多偏微分方程都难以求出解析解,因此需要通过数值计算的方式来求得近似解。 Crank-Nicolson差分格式的原理是将时间轴上的偏微分方程离散化,然后通过差分运算得到一个方程组,进而求解该方程组得到数值解。在离散化过程中,将时间和空间都离散化为若干个区间,其间隔大小分别为Δt和Δx,以此来逼近连续的偏微分方程。对于每个时间步长,我们分别在时间和空间方向上进行更新,进而得到一个更新后的解。 具体来说,Crank-Nicolson差分格式采用的是一个二阶中心差分格式,该格式是一个隐式的数值差分方式,对数值解的数值稳定性和收敛性都有极好的保证。其基本思想是将一个解的时间和空间方向上的差分分别计算出来,然后取两者的平均值作为解的近似值。通过这种方式,能够减少误差,提高计算精度。 总之,Crank-Nicolson差分格式是一种基于二阶中心差分的隐式数值方法,它能够很好地解决偏微分方程计算的误差和收敛性问题,因此在实际应用中受到广泛的欢迎。 ### 回答2: Crank-Nicolson差分格式是一种二阶精度的有限差分格式,被广泛应用于偏微分方程的数值求解,尤其适用于热传导方程、扩散方程等具有稳定解的情况。 其基本思想是将时间步长分为两个部分,用前一半的时间步长采用向前差分(displacement)的方法,用后一半时间步长采用向后差分(Bacward)的方式,即将每个方程都变为两个方程的平均值,这样可以将误差降到二次项。由于这个方法同时使用向前差分和向后差分,所以它同时考虑了未知量的前后信息,从而更加准确。 在时间上离散之后,可以得到离散的差分方程组,然后通过求解线性方程组得到数值解。由于Crank-Nicolson差分格式所计算的每一步都是一个算术平均值,因此结果更加平滑,具有良好的稳定性和收敛性。 Crank-Nicolson差分格式的特点在于其数值解更加准确,因为它同时考虑了未知量的前后信息。其缺点是相对于其它差分格式耗时较大,因为必须计算两个半步长的方程。此外,该方法存在计算的矩阵会是个隐式矩阵,所以需要通过专门的技巧求解线性方程组。 总之,Crank-Nicolson差分格式是一种准确稳定的有限差分格式,适用于求解偏微分方程,特别是求解热传导方程、扩散方程等具有稳定解的情况。 ### 回答3: Crank-Nicolson差分格式是一种常见的数值求解偏微分方程的方法,特别是在热传导等问题中。其原理是使用离散化的空间间隔和时间步长,将偏微分方程转化为线性代数方程组的形式,从而可以通过迭代方法求解数值解。 首先,我们将偏微分方程中的空间变量离散化成网格点,时间变量则离散化成时间步长。这样我们就得到了一个网格,其中每个网格点的值都代表了这个时刻的偏微分方程解。我们通过离散化之后,可以得到一个类似于有限差分的方程组。我们将网格点的值表示为$u_{i,j}$,其中$i$表示空间网格点的编号,$j$表示时间步长的编号。因此,我们将偏微分方程的解离散化为了一个二维矩阵。 接下来,我们将偏微分方程中的时间偏导数用向前差分和向后差分的形式离散化,同时用中心差分的形式离散化空间偏导数。由于Crank-Nicolson方法同时采用了前向差分和后向差分,在时间上具有更高的精度。因为它的中心时间步长和二阶时间导数的中心值相等,从而得到的离散方程形式为: $\frac {1}{2 k}(u_{i,j+1}-u_{i,j-1})=\frac{1}{2h^2}(u_{i+1,j}-2u_{i,j}+u_{i-1,j})+f_{i,j}$ 其中$k$表示时间步长,$h$表示空间步长,$f_{i,j}$是源项。 将上式简化可得: $-r u_{i-1,j}+(2+2r)u_{i,j}-r u_{i+1,j} =s_{i,j-1}+s_{i,j}$ 其中: $r=\frac{k}{2 h^{2}}$ $s_{i,j-1}=\frac{u_{i+1,j-1}-2 u_{i,j-1}+u_{i-1,j-1}}{h^{2}}$ $s_{i,j}=f_{i,j}+\frac{u_{i+1,j-1}-2 u_{i,j-1}+u_{i-1,j-1}}{h^{2}}$ 我们使用上述离散方程组来解决偏微分方程的数值解。初始条件可以通过直接给定或者通过求解另一个初始条件的常微分方程得到。对于边界条件,可以使用指定的边界条件,或者通过用空间点表示数值解的导数来自然地得到。此外,由于离散化的时间步长和空间步长的选择对数值结果有很大影响,因此确定合适的时间和空间步长是使用Crank-Nicolson方法的一个重要考虑因素。 总之,Crank-Nicolson差分格式是一种非常有效的数值求解方法,特别是在处理非线性、高阶或多维偏微分方程时。通过将偏微分方程转化为线性方程组的形式,我们可以应用广泛的数值方法来求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值