解决方案因搭配点选择不同而无法收敛

计算科学 收敛 搭配
2021-12-15 13:42:13

我正在努力学习搭配。例如,我使用的是数字食谱,20.7.12,但改变了基础。也就是说,我正在尝试解决

y+y2y+2=0,1x1,y(1)=y(1)=0

它具有精确解现在,Numerical Recipes 使用的是 Chebyshev 基础,但只是为了对我尝试使用以下基础的方法有所了解:y(x)=1exsinh(2)+e2xsinh(1)sinh(3)

y(x)=n=1Nansin(nπ2(x+1))

搭配方法变成

n=1N[(2+n2π24)sin(nπ2(xm+1))nπ2cos(nπ2(xm+1))]an=2

我们为选择个点。Nxm

我的理解是我有很多选择的自由。例如,我可以选择(切比雪夫节点)。唯一需要担心的是结果矩阵的收敛速度或条件。xmxm=1.0+2(m1)/(N1)xmunif(1,1)xm=cos(2m1)π2N)

这种信念正确吗?在下面的代码中,均匀分布的节点收敛(尽管速度很慢),但选择 Chebyshev 节点作为搭配点似乎发散了!

using LinearAlgebra
using Plots
Plots.GRBackend()

function exact(x::Float64)
    return 1 - (exp(x)*sinh(2.0) + exp(-2*x)*sinh(1.0))/sinh(3.0)
end

function approximate(x::Float64, v::Vector{Float64})
    y = 0.0
    for n in 1:length(v)
        k = n*π/2
        y += v[n]*sin(k*(x+1))
    end
    return y
end

function ode(N::Int64)
    if N < 2
      error("N >= 2 is required.")
    end
    M = Matrix{Float64}(undef, N, N)
    for m in 1:N
      #=Uncomment and the solution will diverge!=#
      #=arg = cos((2*m-1)*π/(2.0*N))=#
      arg = -1.0 + 2.0*(m-1)/(N-1)
      for n in 1:N
        M[m,n] = (2+n*n*π*π/4)*sin(n*π*(arg+1)/2) - n*π*cos(n*π*(arg+1)/2)/2
      end
    end

    c = cond(M,1)
    println("Condition number of matrix is $c")
    B = lu(M)
    b  = Vector{Float64}(undef, N)
    for n in 1:N
      b[n] = 2.0
    end
    v = B\b
    p = plot([exact, x -> approximate(x, v)], xlims=(-1.0, 1.0))
    savefig(p, "solution.png")
end

现在,如果您运行此代码,您将看到给定处 Chebyshev 节点的条件数比均匀间隔节点的条件数更差。但是,我不确定这是一个充分的解释,因为即使在条件数呈现以解决毫无价值之前,搭配也无法收敛。N

0个回答
没有发现任何回复~