我正在努力学习搭配。例如,我使用的是数字食谱,20.7.12,但改变了基础。也就是说,我正在尝试解决
它具有精确解。现在,Numerical Recipes 使用的是 Chebyshev 基础,但只是为了对我尝试使用以下基础的方法有所了解:
搭配方法变成
我们为选择个点。
我的理解是我有很多选择的自由。例如,我可以选择或或(切比雪夫节点)。唯一需要担心的是结果矩阵的收敛速度或条件。
这种信念正确吗?在下面的代码中,均匀分布的节点收敛(尽管速度很慢),但选择 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 节点的条件数比均匀间隔节点的条件数更差。但是,我不确定这是一个充分的解释,因为即使在条件数呈现以解决毫无价值之前,搭配也无法收敛。