使用 FD 和 MATLAB 求解一维偏微分方程

计算科学 matlab pde 有限差分
2021-12-26 04:33:15

我必须解决以下等式:

uxx=1,

x(0,1)u(0)=0,u(1)=0. 我必须用以下数值方案来解决它:

1hk2(12uk1+uk12uk+1)=1. 所以我必须使用非均匀网格。到目前为止,我已经这样做了:

n = 4; %Number points
k = 0:n;
x = 0.5 - 0.5*cos(pi*k/n); %Function to generate points

h = diff(x);
h = h(1:n-1);
h = (h.^2)'; %Difference from point 1 to n-1

b = ones(n-1,1);
b = h.*b; %Solve

A=sparse(diag(2*ones(n-1,1))+diag((-1)*ones(n-2,1),1)+diag((-1)*ones(n-             2,1),-1));

u=A\b;

如您所见,我试图定义使用 for 循环所需的所有内容,并尝试仅使用矩阵乘法来做到这一点。问题是使用 for 循环我无法理解应该是什么值u(1)因为我只有u(0)该方法需要三点。使用“矩阵版本”,我无法理解如何计算包含品脱之间差异的向量。

2个回答

首先,正如史蒂夫指出的那样,您的有限差分是错误的。它一定要是

1h2(ui1+2uiui+1)=1.
这仅适用于结构化网格(点之间的空间恒定)!

当你想用有限差分进行计算时,你不需要三个点,因为你没有及时推进。请记住,这是一个边界值问题!

你需要做的是在你的领域的每个点上写下从 0 到 1 的有限差分方程。

1h2u0+2h2u11h2u2=1...1h2un2+2h2un11h2un=1
u0un是你的边界条件。

现在您可以创建一个方程组,例如Au=ru作为您的解决方案向量和r一个只包含一个的向量。

我没有 MATLAB,所以我无法帮助您编写代码,但这里有一个 Python 示例。

    import numpy as np
    import numpy.linalg as LA

    n = 21 # number of points
    x = np.linspace(0,1,n) # positions of the nodes between 0 and 1
    h = (x[-1]-x[0])/(n-1) # distance between two points
    A = np.zeros((n-2,n-2)) 

    for iter in range(n-2):
        if iter == 0:
            A[iter,iter] = 2/h**2
            A[iter,iter+1] = -1/h**2
        elif iter == n-3:
            A[iter,iter] = 2/h**2
            A[iter,iter-1] = -1/h**2
        else:
            A[iter,iter] = 2/h**2
            A[iter,iter-1] = -1/h**2
            A[iter,iter+1] = -1/h**2

    rhs = np.ones((n-2,1))
    A_inv = LA.inv(A)
    u = np.dot(A_inv,rhs)

在使用非均匀网格之前,您可以尝试使用均匀网格。不要一开始就很难。

几点:

  • 您的积分x_k不在您的域中(0,1). 检查plot(x_k):改为尝试x_k = 0.5 - 0.5*cos(k*pi/n)
  • 您的矢量h还可以包括到端点的距离01
  • 你可以得到点之间的距离diff(x_k)
  • 我认为您的有限差分算子可能是 2 倍。您可能想检查一下,以及不规则网格上的错误是什么
  • 检查所有向量和矩阵的大小:h为 1×2、3 m×3 和u5×1

我之前回答了一个关于交错网格的二阶导数算子矩阵的有限差分逼近的问题。

您在评论中说您不知道如何检查统一网格上的解决方案是否正确:您可以使用确切的解决方案进行调查

u(x)=x(1x)2,
(通过两次积分您的 ODE 并施加边界条件以找到积分常数),并将数值解与精确解进行比较n增加,比如
En:=maxj[1,,n]|Uju(xj)|,
在哪里Uj是你的数值解xj.