我正在从事计算物理任务,我正在寻找一些帮助,因为我已经卡住了!
问题是:
编写一个函数来创建交错网格的二阶导数算子矩阵的有限差分近似。给定输入N(矩阵的大小)和δx(网格间距),函数应以三个数组(a,b,c)的形式返回三对角矩阵。通过修改b的特定元素包括Neumann边界条件u0(-1)= u0(1)= 0
分配的目的是编写一些函数来解决这个非线性椭圆方程:
你'+ 500 * exp(-100 * x ^ 2) - u ^ 3 = 0
在练习课中,我写了一个更简单的解决脚本
u''(x)= f(x)= - exp(x)*( - 2 + 2x + 5x ^ 2 + x ^ 3)
from pylab import *
from scipy import interpolate
def EllipticSolver(Nx):
dx = 1.0/Nx
pts = linspace(-dx/2.0,1.+dx/2.0,Nx+2)
soln = zeros(Nx+2)
rhs = zeros(Nx+2)
rhs = -exp(pts)*(-2.0 + 2.*pts + 5.*pts**2 + pts**3)
soln = tridiagonal2(soln,rhs,dx)
return pts[1:-1], soln[1:-1]
def tridiagonal2(dat,d,dx):
N = len(dat)
print(N)
dx2 = 1.0/(dx*dx)
a = zeros(N)
b = zeros(N)
c = zeros(N)
a[:] = dx2
c[:] = dx2
b[:] = -2.0*dx2
b[1] = -1.0*dx2
b[N-2] = -3.0*dx2
c[1] = c[1]/b[1]
d[1] = d[1]/b[1]
for j in range(2,N-1):
c[j] = c[j]/(b[j] - c[j-1]*a[j])
d[j] = (d[j] - d[j-1]*a[j])/(b[j] - c[j-1]*a[j])
print(a)
print(b)
print(c)
print(d)
dat[N-2] = d[N-2]
for j in range(N-3,0,-1):
dat[j] = d[j] - c[j]*dat[j+1]
return dat
x1, soln1 = EllipticSolver(100)
x2, soln2 = EllipticSolver(200)
x3, soln3 = EllipticSolver(400)
figure(1)
clf()
plot(x1,soln1,'r-')
plot(x2,soln2,'g-')
s2 = interpolate.interp1d(x2,soln2,'cubic')
soln2a = s2(x1)
s3 = interpolate.interp1d(x3,soln3,'cubic')
soln3a = s3(x2)
diff1 = soln1 - soln2a
diff2 = soln2 - soln3a
figure(2)
clf()
plot(x1,diff1,'r-')
plot(x2,4.*diff2,'g-')
所以,Newton-Raphson方法,使用导数的有限差分近似离散
你'=(你[i + 1] +你[i-1] - 2u [i])/ dx2
所以,我要做的第一件事就是为你设置某种数组,以便在for循环中敲击它并用上面的等式填充它我不知道你应该怎么做在这里,我可以使用一个零数组,但我需要一些值来为你得到一些东西
在上面的例子中,我使用我生成的交错网格pts
创建了rhs数组我是否需要为你制作另一个交错的网格,然后用它来制作一个RHS数组:
rhs = zeros(N)
rhs = (ui+1 + ui-1 - 2ui) / dx2
那不太有用,但是沿着这些方向......
任何指针都会受到赞赏,我真的不确定如何正确输入这个额外的变量
谢谢, 利昂
答案 0 :(得分:0)
使用Newton-Raphson方法的东西,正如你所说,它需要一些初始值。当我在uni执行此任务时,我将最终用户输入作为初始猜测。对于您的特定情况,您可能希望对初始猜测进行硬编码。