using NonlinearSolve, LinearAlgebra, Plots
# Parameters: p = [h, \omega]
N=15
g(u,p) = p[1]*Tridiagonal(fill(1,N), fill(-2,N+1), fill(1,N))*u - u.^3 - p[2]*u
probg = NonlinearProblem{false}(g, [0.3; fill(0.3, N-1); 0.3], [0.6, -0.4])
solver = solve(probg, NewtonRaphson(), reltol = 1e-9)
在上面的代码中,我利用
NonlinearSolve.jl
包来解决椭圆非线性问题。解决方案通常是对称的。下面是上面代码的输出。注意解决方案的对称性。
为了节省计算时间,我想只解决一半的问题。我如何在这个包中指定它?
例子:
9.165610097608932e-13
2.704903846479506e-12
4.63792285826381e-12
5.947401561035362e-12
6.6334560728468356e-12
6.943120557656446e-12
7.068988650731425e-12
7.112134991181518e-12
7.112134991181518e-12
7.068988650731425e-12
6.9431205305513916e-12
6.633456045741781e-12
5.947401533930308e-12
4.63792285826381e-12
2.7049038871370876e-12
9.165610097608932e-13
只需在非线性求解的
f
函数上创建一个闭包,该函数接受正在求解的一半,填充另一半,然后计算完整的残差。