import%20marimo%0A%0A__generated_with%20%3D%20%220.9.27%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20%C2%A74%20%E6%8A%9B%E7%89%A9%E6%96%B9%E7%A8%8B%E7%9A%84%E5%B7%AE%E5%88%86%E6%A0%BC%E5%BC%8F%3Cbr%3E95%E9%A1%B5%E7%BB%83%E4%B9%A0%E9%A2%988%20%E9%9A%90%E6%A0%BC%E5%BC%8F%E5%A6%82%E4%BD%95%E9%80%89%E6%AD%A5%E9%95%BF%E5%B9%B6%E6%B6%88%E9%99%A4%E6%8C%AF%E8%8D%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20numpy%20import%20linalg%0A%0A%20%20%20%20np.set_printoptions(precision%3D3%2C%20suppress%3DTrue)%0A%20%20%20%20return%20linalg%2C%20np%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20from%20matplotlib%20import%20pyplot%20as%20plt%0A%20%20%20%20return%20(plt%2C)%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20from%20typing%20import%20override%0A%20%20%20%20return%20(override%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E5%B7%A5%E5%85%B7%E5%87%BD%E6%95%B0%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20from%20util%20import%20multi_diag%2C%20plot_surface%2C%20show_files%2C%20typst%0A%20%20%20%20return%20multi_diag%2C%20plot_surface%2C%20show_files%2C%20typst%0A%0A%0A%40app.cell%0Adef%20__(multi_diag)%3A%0A%20%20%20%20multi_diag(%5B-1%2C%202%2C%203%5D%2C%20size%3D5)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E9%97%AE%E9%A2%98%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(typst)%3A%0A%20%20%20%20typst(r%22%22%22%0A%20%20%20%20%23import%20%22%40preview%2Fphysica%3A0.9.3%22%3A%20pdv%2C%20eval%0A%0A%20%20%20%20%24%0A%20%20%20%20pdv(u%2Ct)%20%3D%20pdv(u%2Cx%2C2)%2C%20quad%20x%20in%20(0%2C1)%2C%20t%20in%20RR%5E%2B.%0A%20%20%20%20%24%0A%0A%20%20%20%20%24%0A%20%20%20%20eval(u)_(t%3D0)%20%26%3D%20e%5E(-x)%2C%20%26%20x%20%26in%20(0%2C1).%20%5C%0A%20%20%20%20eval(u)_(x%3D0)%20%26%3D%20e%5Et%2C%20%26%20t%20%26in%20RR%5E%2B.%20%5C%0A%20%20%20%20eval(u)_(x%3D1)%20%26%3D%20e%5E(t-1)%2C%20%26%20t%20%26in%20RR%5E%2B.%20%5C%0A%20%20%20%20%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(typst)%3A%0A%20%20%20%20typst(r%22%22%22%0A%20%20%20%20%E7%BD%91%E6%A0%BC%20%24h%20%3D%202%5E(-n)%2C%202%20%3C%3D%20n%20%3C%3D%2010%24%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20x_min%20%3D%200%0A%20%20%20%20x_max%20%3D%201%0A%20%20%20%20t_min%20%3D%200%0A%20%20%20%20t_max%20%3D%201.602176634%0A%20%20%20%20return%20t_max%2C%20t_min%2C%20x_max%2C%20x_min%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E5%85%88%E7%94%A8%E4%B8%80%E7%BB%84%E5%8F%82%E6%95%B0%E6%B5%8B%E8%AF%95%E3%80%82%EF%BC%88%E5%88%86%E5%BC%80%E8%AE%BE%E7%BD%AE%EF%BC%8C%E8%BF%99%E6%A0%B7%E6%9B%B4%E6%96%B0%E6%97%B6%E5%8F%AF%E5%8F%AA%E9%87%8D%E7%AE%97%E4%B8%80%E9%83%A8%E5%88%86%E3%80%82%EF%BC%89%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20lb_dx%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20-10%2C%0A%20%20%20%20%20%20%20%20-2%2C%0A%20%20%20%20%20%20%20%201%2C%0A%20%20%20%20%20%20%20%20value%3D-2%2C%0A%20%20%20%20%20%20%20%20label%3Dr%22%24%5Clog_2%20%5Cmathrm%7Bd%7Dx%24%22%2C%0A%20%20%20%20%20%20%20%20show_value%3DTrue%2C%0A%20%20%20%20%20%20%20%20debounce%3DTrue%2C%0A%20%20%20%20)%0A%20%20%20%20lb_dx%0A%20%20%20%20return%20(lb_dx%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(lb_dx%2C%20mo)%3A%0A%20%20%20%20dx%20%3D%202**lb_dx.value%0A%20%20%20%20mo.md(rf%22%24%5Cmathrm%7B%7Bd%7D%7Dx%20%3D%20%7Bdx%7D%24.%22)%0A%20%20%20%20return%20(dx%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20r%20%3D%20mo.ui.slider(0.1%2C%2010.0%2C%200.2%2C%20label%3Dr%22%24r%24%22%2C%20show_value%3DTrue%2C%20debounce%3DTrue)%0A%20%20%20%20r%0A%20%20%20%20return%20(r%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dx%2C%20mo%2C%20r)%3A%0A%20%20%20%20dt%20%3D%20r.value%20*%20dx**2%0A%20%20%20%20mo.md(rf%22%24%5Cmathrm%7B%7Bd%7D%7Dt%20%3D%20%7Bdt%7D%24.%22)%0A%20%20%20%20return%20(dt%2C)%0A%0A%0A%40app.cell%0Adef%20__(dx%2C%20np%2C%20x_max%2C%20x_min)%3A%0A%20%20%20%20x%20%3D%20np.arange(x_min%2C%20x_max%20%2B%20dx%2C%20dx)%0A%20%20%20%20x%5B%3A5%5D%2C%20x%5B-5%3A%5D%0A%20%20%20%20return%20(x%2C)%0A%0A%0A%40app.cell%0Adef%20__(dt%2C%20np%2C%20t_max%2C%20t_min)%3A%0A%20%20%20%20t%20%3D%20np.arange(t_min%2C%20t_max%20%2B%20dt%2C%20dt)%0A%20%20%20%20t%5B%3A5%5D%2C%20t%5B-5%3A%5D%0A%20%20%20%20return%20(t%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20ref%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20ref(t%2C%20x)%2C%20title%3D%22%E7%9C%9F%E8%A7%A3%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20from%20parabolic_pde%20import%20(%0A%20%20%20%20%20%20%20%20AdaptiveSolver%2C%0A%20%20%20%20%20%20%20%20Solver%2C%0A%20%20%20%20%20%20%20%20benchmark%2C%0A%20%20%20%20%20%20%20%20plot_benchmark%2C%0A%20%20%20%20%20%20%20%20ref%2C%0A%20%20%20%20%20%20%20%20setup_conditions%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20AdaptiveSolver%2C%0A%20%20%20%20%20%20%20%20Solver%2C%0A%20%20%20%20%20%20%20%20benchmark%2C%0A%20%20%20%20%20%20%20%20plot_benchmark%2C%0A%20%20%20%20%20%20%20%20ref%2C%0A%20%20%20%20%20%20%20%20setup_conditions%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20__(np%2C%20t_max%2C%20t_min%2C%20x_max%2C%20x_min)%3A%0A%20%20%20%20benchmark_kwargs%20%3D%20dict(%0A%20%20%20%20%20%20%20%20x_max%3Dx_max%2C%0A%20%20%20%20%20%20%20%20x_min%3Dx_min%2C%0A%20%20%20%20%20%20%20%20t_max%3Dt_max%2C%0A%20%20%20%20%20%20%20%20t_min%3Dt_min%2C%0A%20%20%20%20%20%20%20%20dx_list%3D2.0%20**%20np.arange(-10%2C%20-2%2C%201)%2C%0A%20%20%20%20%20%20%20%20dt%3D0.01%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(benchmark_kwargs%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%200%20%E6%9C%80%E7%AE%80%E6%98%BE%E6%A0%BC%E5%BC%8F%EF%BC%88%60ex%60%EF%BC%89%0A%0A%20%20%20%20%20%20%20%20%E6%9C%AC%E6%83%B3%E5%AE%9E%E7%8E%B0%E6%9C%80%E7%AE%80%E9%9A%90%E6%A0%BC%E5%BC%8F%EF%BC%8C%E4%B8%8D%E5%B0%8F%E5%BF%83%E5%81%9A%E6%88%90%E4%BA%86%E6%98%BE%E6%A0%BC%E5%BC%8F%E2%80%A6%E2%80%A6%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E5%85%B6%E5%AE%9E%E9%83%BD%E6%98%AF%E4%B8%80%E6%AC%A1%E6%B1%82%E4%B8%80%E8%A1%8C%EF%BC%88%E4%B8%80%E4%B8%AA%20%24t%24%EF%BC%89%E3%80%82%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(Solver%2C%20multi_diag%2C%20np%2C%20override)%3A%0A%20%20%20%20class%20SolverExplicit(Solver)%3A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20post_init(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20to_next_u%5B%23next_x%2C%20%23current_x%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.to_next_u%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.eye(self.x.size)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20self.dt%20*%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20)%5B1%3A-1%2C%20%3A%5D%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20step(self%2C%20t)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B1%3A-1%2C%20t%5D%20%3D%20self.to_next_u%20%40%20self.u%5B%3A%2C%20t%20-%201%5D%0A%20%20%20%20return%20(SolverExplicit%2C)%0A%0A%0A%40app.cell%0Adef%20__(SolverExplicit%2C%20t%2C%20x)%3A%0A%20%20%20%20solver_ex%20%3D%20SolverExplicit(t%3Dt%2C%20x%3Dx)%0A%20%20%20%20solver_ex.solve()%0A%20%20%20%20solver_ex.to_next_u%0A%20%20%20%20return%20(solver_ex%2C)%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_ex%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_ex.u%2C%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_ex%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_ex.error()%2C%20title%3D%22%E8%AF%AF%E5%B7%AE%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(solver_ex)%3A%0A%20%20%20%20solver_ex.max_error()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%201%20%E6%9C%80%E7%AE%80%E9%9A%90%E6%A0%BC%E5%BC%8F%EF%BC%88%60im%60%EF%BC%89%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E5%8D%95%E6%AC%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(Solver%2C%20linalg%2C%20multi_diag%2C%20np%2C%20override)%3A%0A%20%20%20%20class%20SolverImplicit(Solver)%3A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20post_init(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20to_previous_u%5B%23previous_x%2C%20%23current_x%5D%20(without%20boundary)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.to_previous_u%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.eye(self.x.size%20-%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20*%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size%20-%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.to_previous_u_inv%20%3D%20linalg.inv(self.to_previous_u)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%20%3D%20np.empty(self.x.size%20-%202)%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20step(self%2C%20t)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20RHS%20is%20derived%20from%20the%20equation%20in%20%E2%80%9Cvalidate%E2%80%9D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B%3A%5D%20%3D%20self.u%5B1%3A-1%2C%20t%20-%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B0%5D%20%2B%3D%20self.dt%20*%20self.u%5B0%2C%20t%5D%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B-1%5D%20%2B%3D%20self.dt%20*%20self.u%5B-1%2C%20t%5D%20%2F%20self.dx**2%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B1%3A-1%2C%20t%5D%20%3D%20self.to_previous_u_inv%20%40%20self.rhs%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20validate(self%2C%20t%3A%20int)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20to_previous_u%5B%23previous_x%2C%20%23current_x%5D%20(only%20with%20current%20boundary)%0A%20%20%20%20%20%20%20%20%20%20%20%20to_previous_u%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.eye(self.x.size)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-%20self.dt%20*%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20)%5B1%3A-1%2C%20%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20to_previous_u%20(only%20with%20current%20boundary)%20%40%20current_x%20(with%20boundary)%20%3D%20previous_x%20(without%20boundary)%0A%20%20%20%20%20%20%20%20%20%20%20%20assert%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.abs(to_previous_u%20%40%20self.u%5B%3A%2C%20t%5D%20-%20self.u%5B1%3A-1%2C%20t%20-%201%5D).max()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%201e-6%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(SolverImplicit%2C)%0A%0A%0A%40app.cell%0Adef%20__(SolverImplicit%2C%20t%2C%20x)%3A%0A%20%20%20%20solver_im%20%3D%20SolverImplicit(t%3Dt%2C%20x%3Dx)%0A%20%20%20%20solver_im.solve()%0A%0A%20%20%20%20%23%20Validate%20the%20last%20%60t%60%0A%20%20%20%20solver_im.validate(solver_im.t.size%20-%201)%0A%0A%20%20%20%20solver_im.to_previous_u%0A%20%20%20%20return%20(solver_im%2C)%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_im%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_im.u%2C%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_im%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_im.error()%2C%20title%3D%22%E8%AF%AF%E5%B7%AE%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(solver_im)%3A%0A%20%20%20%20solver_im.max_error()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E7%BB%9F%E8%AE%A1%E6%80%A7%E8%83%BD%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(SolverImplicit%2C%20benchmark%2C%20benchmark_kwargs%2C%20mo)%3A%0A%20%20%20%20with%20mo.persistent_cache(%22stat_im%22)%3A%0A%20%20%20%20%20%20%20%20stat_im%20%3D%20benchmark(SolverImplicit%2C%20**benchmark_kwargs)%0A%20%20%20%20stat_im%0A%20%20%20%20return%20(stat_im%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_benchmark%2C%20stat_im)%3A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plot_benchmark(stat_im)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%202%20CN%E6%A0%BC%E5%BC%8F%EF%BC%88%60cn%60%EF%BC%89%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E5%8D%95%E6%AC%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(Solver%2C%20linalg%2C%20multi_diag%2C%20np%2C%20override)%3A%0A%20%20%20%20class%20SolverCrankNicolson(Solver)%3A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20post_init(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(%E2%88%82%C2%B2%2F%E2%88%82x%C2%B2)%5B%23x_current_without_boundary%2C%20%23x_previous_with_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.dv_x_2_previous%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%5B1%3A-1%2C%20%3A%5D%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20a_current%5B%23previous_x%2C%20%23current_x%5D%20(without%20boundary)%0A%20%20%20%20%20%20%20%20%20%20%20%20a_current%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-np.eye(self.x.size%20-%202)%20%2F%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size%20-%202)%20%2F%20self.dx**2%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.a_current_inv%20%3D%20linalg.inv(a_current)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%20%3D%20np.empty(self.x.size%20-%202)%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20step(self%2C%20t)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20A%20%40%20u_current%20%2B%20boundary%20terms%20%2B%20A'%20%40%20u_previous%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B%3A%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B1%3A-1%2C%20t%20-%201%5D%20%2F%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20self.dv_x_2_previous%20%40%20self.u%5B%3A%2C%20t%20-%201%5D%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B0%5D%20%2B%3D%20self.u%5B0%2C%20t%5D%20%2F%20self.dx**2%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B-1%5D%20%2B%3D%20self.u%5B-1%2C%20t%5D%20%2F%20self.dx**2%20%2F%202%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B1%3A-1%2C%20t%5D%20%3D%20self.a_current_inv%20%40%20-self.rhs%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20validate(self%2C%20t%3A%20int)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(%E2%88%82%C2%B2%2F%E2%88%82x%C2%B2)%5B%23x_without_boundary%2C%20%23x_with_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20dv_x_2%20%3D%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%5B1%3A-1%2C%20%3A%5D%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(approximate%20%E2%88%82%C2%B2u%2F%E2%88%82x%C2%B2)%5B%23x_without_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20approx_dv_x_2%20%3D%20dv_x_2%20%40%20(self.u%5B%3A%2C%20t%5D%20%2B%20self.u%5B%3A%2C%20t%20-%201%5D)%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(approximate%20%E2%88%82u%2F%E2%88%82t)%5B%23x_without_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20approx_dv_t%20%3D%20(self.u%5B1%3A-1%2C%20t%5D%20-%20self.u%5B1%3A-1%2C%20t%20-%201%5D)%20%2F%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20assert%20np.abs(approx_dv_t%20-%20approx_dv_x_2).max()%20%3C%201e-6%0A%20%20%20%20return%20(SolverCrankNicolson%2C)%0A%0A%0A%40app.cell%0Adef%20__(SolverCrankNicolson%2C%20t%2C%20x)%3A%0A%20%20%20%20solver_cn%20%3D%20SolverCrankNicolson(t%3Dt%2C%20x%3Dx)%0A%20%20%20%20solver_cn.solve()%0A%0A%20%20%20%20%23%20Validate%20the%20last%20%60t%60%0A%20%20%20%20solver_cn.validate(solver_cn.t.size%20-%201)%0A%0A%20%20%20%20solver_cn.dv_x_2_previous%0A%20%20%20%20return%20(solver_cn%2C)%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_cn%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_cn.u%2C%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_cn%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_cn.error()%2C%20title%3D%22%E8%AF%AF%E5%B7%AE%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(solver_cn)%3A%0A%20%20%20%20solver_cn.max_error()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E7%BB%9F%E8%AE%A1%E6%80%A7%E8%83%BD%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(SolverCrankNicolson%2C%20benchmark%2C%20benchmark_kwargs%2C%20mo)%3A%0A%20%20%20%20with%20mo.persistent_cache(%22stat_cn%22)%3A%0A%20%20%20%20%20%20%20%20stat_cn%20%3D%20benchmark(SolverCrankNicolson%2C%20**benchmark_kwargs)%0A%20%20%20%20stat_cn%0A%20%20%20%20return%20(stat_cn%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_benchmark%2C%20stat_cn)%3A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plot_benchmark(stat_cn)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%203%20%E6%8C%AF%E8%8D%A1%E7%8E%B0%E8%B1%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E5%8E%9F%E9%97%AE%E9%A2%98%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dx%2C%20lb_dx%2C%20mo)%3A%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20%7Blb_dx%7D%0A%20%20%20%20%24%5Cmathrm%7B%7Bd%7D%7Dx%20%3D%20%7Bdx%7D%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dt%2C%20mo%2C%20r)%3A%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20%7Br%7D%0A%20%20%20%20%24%5Cmathrm%7B%7Bd%7D%7Dt%20%3D%20%7Bdt%7D%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(plot_surface%2C%20solver_cn%2C%20t%2C%20x)%3A%0A%20%20%20%20plot_surface(t%2C%20x%2C%20solver_cn.u%2C%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E8%B0%83%E5%88%B0%E6%9C%80%E7%B2%97%20%24%5Cmathrm%7Bd%7Dx%20%3D%200.25%2C%20%5Cmathrm%7Bd%7Dt%20%3D%200.625%24%20%E4%B9%9F%E6%B2%A1%E6%8C%AF%E8%8D%A1%E5%91%A2%E2%80%A6%E2%80%A6%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E6%9B%B4%E6%94%B9%E6%9D%A1%E4%BB%B6%EF%BC%88%60gate%60%EF%BC%89%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(typst)%3A%0A%20%20%20%20typst(r%22%22%22%0A%20%20%20%20%23import%20%22%40preview%2Fphysica%3A0.9.3%22%3A%20eval%0A%0A%20%20%20%20%24%0A%20%20%20%20eval(u)_(t%3D0)%20%26%3D%20I_((1%2F3%2C%202%2F3)).%20%5C%0A%20%20%20%20eval(u)_(x%3D0)%20%26%3D%200%2C%20%26%20t%20%26in%20RR%5E%2B.%20%5C%0A%20%20%20%20eval(u)_(x%3D1)%20%26%3D%200%2C%20%26%20t%20%26in%20RR%5E%2B.%20%5C%0A%20%20%20%20%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(SolverCrankNicolson%2C%20dt_gate%2C%20np%2C%20t_max%2C%20t_min%2C%20x_max%2C%20x_min)%3A%0A%20%20%20%20solver_gate%20%3D%20SolverCrankNicolson(%0A%20%20%20%20%20%20%20%20t%3Dnp.arange(t_min%2C%20t_max%2C%20dt_gate.value)%2C%0A%20%20%20%20%20%20%20%20x%3Dnp.linspace(x_min%2C%20x_max%2C%2020)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20%E5%8F%A6%E8%AE%BE%E5%88%9D%E5%A7%8B%E6%9D%A1%E4%BB%B6%0A%20%20%20%20solver_gate.u%5B%3A%2C%200%5D%20%3D%20(1%20%2F%203%20%3C%20solver_gate.x)%20%26%20(solver_gate.x%20%3C%202%20%2F%203)%0A%20%20%20%20solver_gate.u%5B0%2C%20%3A%5D%20%3D%200%0A%20%20%20%20solver_gate.u%5B-1%2C%20%3A%5D%20%3D%200%0A%0A%20%20%20%20solver_gate.solve()%0A%0A%20%20%20%20%23%20Validate%20the%20last%20%60t%60%0A%20%20%20%20solver_gate.validate(solver_gate.t.size%20-%201)%0A%20%20%20%20return%20(solver_gate%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20dt_gate%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20%7Bstr(v)%3A%20v%20for%20v%20in%20%5B0.001%2C%200.002%2C%200.008%2C%200.016%2C%200.032%5D%7D%2C%0A%20%20%20%20%20%20%20%20%220.032%22%2C%0A%20%20%20%20%20%20%20%20label%3Dr%22%24%5Cmathrm%7Bd%7Dt%20%3D%24%22%2C%0A%20%20%20%20%20%20%20%20allow_select_none%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20dt_gate%0A%20%20%20%20return%20(dt_gate%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate)%3A%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_gate.t%2C%0A%20%20%20%20%20%20%20%20solver_gate.x%2C%0A%20%20%20%20%20%20%20%20solver_gate.u%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate)%3A%0A%20%20%20%20_concerned%20%3D%20(0.1%20%3C%20solver_gate.t)%20%26%20(solver_gate.t%20%3C%200.3)%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_gate.t%5B_concerned%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate.x%2C%0A%20%20%20%20%20%20%20%20solver_gate.u%5B%3A%2C%20_concerned%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%EF%BC%88%E5%B1%80%E9%83%A8%E6%94%BE%E5%A4%A7%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%E8%BE%B9%E7%95%8C%E6%9D%A1%E4%BB%B6%E4%B8%BA%E9%9B%B6%EF%BC%8C%24u%24%20%E9%80%90%E6%B8%90%E8%A1%B0%E5%87%8F%E3%80%82%E4%B8%BA%E9%81%BF%E5%85%8D%E5%88%9D%E5%A7%8B%E6%9D%A1%E4%BB%B6%E9%81%AE%E6%8C%A1%EF%BC%8C%E8%BF%99%E9%87%8C%E5%8F%8D%E8%BD%AC%E4%BA%86%20%24t%24%20%E8%BD%B4%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%E2%80%94%E2%80%94%E6%80%BB%E4%B9%8B%E5%87%BA%E7%8E%B0%E6%8C%AF%E8%8D%A1%E4%BA%86%E3%80%82%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plt%2C%20solver_gate)%3A%0A%20%20%20%20_x_range%20%3D%20slice(4%2C%209)%0A%20%20%20%20_t_range%20%3D%20solver_gate.t%20%3C%200.3%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots()%0A%20%20%20%20_ax.plot(%0A%20%20%20%20%20%20%20%20solver_gate.t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate.u%5B_x_range%2C%20_t_range%5D.T%2C%0A%20%20%20%20%20%20%20%20label%3D%5Bf%22%24x%20%3D%20%7B_x%3A.2f%7D%24%22%20for%20_x%20in%20solver_gate.x%5B_x_range%5D%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_ax.set_xlabel(%22%24t%24%22)%0A%20%20%20%20_ax.set_ylabel(%22%24u%24%22)%0A%20%20%20%20_ax.grid(True)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%204%20%E6%B6%88%E9%99%A4%E6%8C%AF%E8%8D%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%20%E6%B3%95%E4%B8%80%EF%BC%9A%E8%87%AA%E9%80%82%E5%BA%94%E6%97%B6%E9%97%B4%E6%AD%A5%E9%95%BF%0A%0A%20%20%20%20%20%20%20%20%E9%A6%96%E5%85%88%E8%A6%81%E6%A3%80%E6%B5%8B%E6%8C%AF%E8%8D%A1%E3%80%82%E6%8C%AF%E8%8D%A1%E5%9C%A8%E6%97%B6%E9%97%B4%E3%80%81%E7%A9%BA%E9%97%B4%E4%B8%8A%E9%83%BD%E6%9C%89%EF%BC%8C%E4%B8%BB%E8%A6%81%E6%98%AF%E6%A3%80%E6%B5%8B%E6%97%B6%E9%97%B4%E4%B8%8A%E7%9A%84%E3%80%82%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%23%20%E5%8D%95%E6%AC%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dt_gate)%3A%0A%20%20%20%20dt_gate%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(np%2C%20plt%2C%20solver_gate)%3A%0A%20%20%20%20_t_range%20%3D%20solver_gate.t%20%3C%200.3%0A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plt.subplots(nrows%3D3%2C%20sharex%3DTrue%2C%20layout%3D%22constrained%22)%0A%0A%20%20%20%20_axs%5B0%5D.pcolorfast(%0A%20%20%20%20%20%20%20%20solver_gate.t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate.x%2C%0A%20%20%20%20%20%20%20%20np.diff(solver_gate.u%5B%3A%2C%20_t_range%5D%2C%20axis%3D1)%2C%0A%20%20%20%20)%0A%20%20%20%20_axs%5B0%5D.set_title(r%22%24%5CDelta_t%20u%24%EF%BC%88%E5%A2%9E%E9%87%8F%EF%BC%89%22)%0A%0A%20%20%20%20_axs%5B1%5D.pcolorfast(%0A%20%20%20%20%20%20%20%20solver_gate.t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate.x%2C%0A%20%20%20%20%20%20%20%20np.sign(np.diff(solver_gate.u%5B%3A%2C%20_t_range%5D%2C%20axis%3D1)).astype(np.int8)%2C%0A%20%20%20%20)%0A%20%20%20%20_axs%5B1%5D.set_title(r%22%24%5Coperatorname%7Bsgn%7D%20%5CDelta_t%20u%24%EF%BC%88%E5%8D%95%E8%B0%83%E6%80%A7%EF%BC%89%22)%0A%0A%20%20%20%20_axs%5B2%5D.pcolorfast(%0A%20%20%20%20%20%20%20%20solver_gate.t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate.x%2C%0A%20%20%20%20%20%20%20%20np.diff(%0A%20%20%20%20%20%20%20%20%20%20%20%20np.sign(np.diff(solver_gate.u%5B%3A%2C%20_t_range%5D%2C%20axis%3D1)).astype(np.int8)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20axis%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20!%3D%200%2C%0A%20%20%20%20)%0A%20%20%20%20_axs%5B2%5D.set_title(%0A%20%20%20%20%20%20%20%20r%22%24%5CDelta_t%20%5Coperatorname%7Bsgn%7D%20%5CDelta_t%20u%20%5Cneq%200%24%EF%BC%88%E5%8D%95%E8%B0%83%E6%80%A7%E5%9C%A8%E5%8F%98%E5%8C%96%EF%BC%89%22%0A%20%20%20%20)%0A%0A%20%20%20%20for%20_ax%20in%20_axs%3A%0A%20%20%20%20%20%20%20%20_ax.set_ylabel(%22%24x%24%22)%0A%20%20%20%20_axs%5B-1%5D.set_xlabel(%22%24t%24%22)%0A%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(is_trembling%2C%20solver_gate)%3A%0A%20%20%20%20is_trembling(solver_gate.u%5B%3A%2C%20%3A5%5D.T)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(Collection%2C%20Final%2C%20np)%3A%0A%20%20%20%20def%20is_trembling(u%3A%20Final%5BCollection%5Bnp.ndarray%5D%5D)%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E6%A3%80%E6%9F%A5u%E6%98%AF%E5%90%A6%E5%9C%A8%E6%8C%AF%E8%8D%A1%0A%0A%20%20%20%20%20%20%20%20Params%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20u%5B%23t%5D%5B%23x%5D%0A%0A%20%20%20%20%20%20%20%20%E8%8B%A5%E8%B6%85%E8%BF%8710%25%E7%9A%84x%E6%9C%89%E8%B6%85%E8%BF%8750%25%E7%9A%84t%E5%8F%91%E7%94%9F%E5%8D%95%E8%B0%83%E6%80%A7%E5%8F%98%E5%8C%96%EF%BC%88%CE%94%E2%82%9C%20sgn%20%CE%94%E2%82%9C%20u%20%E2%89%A0%200%EF%BC%89%EF%BC%8C%E5%88%99%E5%88%A4%E4%B8%BA%E6%8C%AF%E8%8D%A1%EF%BC%9B%E5%90%A6%E5%88%99%E5%88%A4%E4%B8%BA%E4%B8%8D%E6%8C%AF%E8%8D%A1%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%20changed%5B%23t%2C%20%23x%5D%0A%20%20%20%20%20%20%20%20changed%20%3D%20np.diff(np.sign(np.diff(u%2C%20axis%3D0)).astype(np.int8)%2C%20axis%3D0)%20!%3D%200%0A%20%20%20%20%20%20%20%20return%20(changed.mean(axis%3D0)%20%3E%200.5).mean()%20%3E%200.1%0A%20%20%20%20return%20(is_trembling%2C)%0A%0A%0A%40app.cell%0Adef%20__(is_trembling%2C%20np)%3A%0A%20%20%20%20_t%20%3D%20np.arange(6)%0A%20%20%20%20_x%20%3D%20np.arange(5)%0A%0A%20%20%20%20assert%20not%20is_trembling(np.ones((_t.size%2C%20_x.size)))%0A%20%20%20%20assert%20is_trembling(np.einsum(%22t%2Cx-%3Etx%22%2C%20_t%2C%20_x)%20%25%202)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E7%84%B6%E5%90%8E%E5%86%8D%E6%A0%B9%E6%8D%AE%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E6%8C%AF%E8%8D%A1%E8%87%AA%E9%80%82%E5%BA%94%E8%B0%83%E6%95%B4%20%24%5Cmathrm%7Bd%7Dt%24%E3%80%82%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(AdaptiveSolver%2C%20is_trembling%2C%20linalg%2C%20multi_diag%2C%20np%2C%20override)%3A%0A%20%20%20%20class%20AdaptiveSolverCrankNicolson(AdaptiveSolver)%3A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20post_init(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(%E2%88%82%C2%B2%2F%E2%88%82x%C2%B2)%5B%23x_current_without_boundary%2C%20%23x_previous_with_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.dv_x_2_previous%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%5B1%3A-1%2C%20%3A%5D%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.refresh_for_dt_changes()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%20%3D%20np.empty(self.x.size%20-%202)%0A%0A%20%20%20%20%20%20%20%20def%20refresh_for_dt_changes(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20a_current%5B%23previous_x%2C%20%23current_x%5D%20(without%20boundary)%0A%20%20%20%20%20%20%20%20%20%20%20%20a_current%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-np.eye(self.x.size%20-%202)%20%2F%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size%20-%202)%20%2F%20self.dx**2%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.a_current_inv%20%3D%20linalg.inv(a_current)%0A%0A%20%20%20%20%20%20%20%20def%20try_step(self)%20-%3E%20tuple%5Bfloat%2C%20np.ndarray%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Calculate%20the%20next%20t%2Cu%20without%20checking%20trembling%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20A%20%40%20u_current%20%2B%20boundary%20terms%20%2B%20A'%20%40%20u_previous%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Next%20t%0A%20%20%20%20%20%20%20%20%20%20%20%20t%20%3D%20self.t%5B-1%5D%20%2B%20self.dt%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Prepare%20next%20u%0A%20%20%20%20%20%20%20%20%20%20%20%20u%20%3D%20np.zeros(self.x.size)%0A%20%20%20%20%20%20%20%20%20%20%20%20u%5B0%5D%20%3D%20self.u_boundary%5B0%5D(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20u%5B-1%5D%20%3D%20self.u_boundary%5B1%5D(t)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B%3A%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B-1%5D%5B1%3A-1%5D%20%2F%20self.dt%20%2B%20self.dv_x_2_previous%20%40%20self.u%5B-1%5D%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B0%5D%20%2B%3D%20u%5B0%5D%20%2F%20self.dx**2%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20self.rhs%5B-1%5D%20%2B%3D%20u%5B-1%5D%20%2F%20self.dx**2%20%2F%202%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20u%5B1%3A-1%5D%20%3D%20self.a_current_inv%20%40%20-self.rhs%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20t%2C%20u%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20step(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20t%2C%20u%20%3D%20self.try_step()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%AE%9A%E6%9C%9F%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E6%9C%89%E6%8C%AF%E8%8D%A1%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E5%88%9D%20len(self.t)%20%3D%3D%201%EF%BC%8C%E6%95%85%E8%BF%9B%E5%85%A5if%E5%88%99%E5%BF%85%E5%B7%B2%E6%9C%89%E8%B6%B3%E5%A4%9F%E6%95%B0%E6%8D%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(self.t)%20%25%205%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trembling%20%3D%20is_trembling(%5Bself.u%5Bn%5D%20for%20n%20in%20range(-4%2C%200)%5D%20%2B%20%5Bu%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20trembling%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8B%A5%E6%97%A0%EF%BC%8C%E8%80%83%E8%99%91%E4%BB%A5%E5%90%8E%E5%A2%9E%E5%A4%A7dt%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(self.t)%20%25%2010%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.dt%20*%3D%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.refresh_for_dt_changes()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8B%A5%E6%9C%89%EF%BC%8C%E5%9B%9E%E9%80%80%EF%BC%8C%E7%BC%A9%E5%B0%8Fdt%EF%BC%8C%E9%87%8D%E7%AE%97%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20trembling%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%9B%9E%E9%80%80%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(-4%2C%200)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.t.pop()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.u.pop()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.dt%20%2F%3D%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.refresh_for_dt_changes()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E9%87%8D%E7%AE%97%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(-4%2C%200)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20t%2C%20u%20%3D%20self.try_step()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.t.append(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.u.append(u)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20t%2C%20u%20%3D%20self.try_step()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%86%8D%E6%AC%A1%E6%A3%80%E6%9F%A5%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trembling%20%3D%20is_trembling(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bself.u%5Bn%5D%20for%20n%20in%20range(-4%2C%200)%5D%20%2B%20%5Bu%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.t.append(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.u.append(u)%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20validate(self%2C%20t%3A%20int)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(%E2%88%82%C2%B2%2F%E2%88%82x%C2%B2)%5B%23x_without_boundary%2C%20%23x_with_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20dv_x_2%20%3D%20multi_diag(%5B1%2C%20-2%2C%201%5D%2C%20size%3Dself.x.size)%5B1%3A-1%2C%20%3A%5D%20%2F%20self.dx**2%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(approximate%20%E2%88%82%C2%B2u%2F%E2%88%82x%C2%B2)%5B%23x_without_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20approx_dv_x_2%20%3D%20dv_x_2%20%40%20(self.u%5Bt%5D%20%2B%20self.u%5Bt%20-%201%5D)%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20(approximate%20%E2%88%82u%2F%E2%88%82t)%5B%23x_without_boundary%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20approx_dv_t%20%3D%20(self.u%5Bt%5D%5B1%3A-1%5D%20-%20self.u%5Bt%20-%201%5D%5B1%3A-1%5D)%20%2F%20self.dt%0A%20%20%20%20%20%20%20%20%20%20%20%20assert%20np.abs(approx_dv_t%20-%20approx_dv_x_2).max()%20%3C%201e-6%0A%20%20%20%20return%20(AdaptiveSolverCrankNicolson%2C)%0A%0A%0A%40app.cell%0Adef%20__(%0A%20%20%20%20AdaptiveSolverCrankNicolson%2C%0A%20%20%20%20dt_gate%2C%0A%20%20%20%20np%2C%0A%20%20%20%20t_max%2C%0A%20%20%20%20t_min%2C%0A%20%20%20%20x_max%2C%0A%20%20%20%20x_min%2C%0A)%3A%0A%20%20%20%20_x%20%3D%20np.linspace(x_min%2C%20x_max%2C%2020)%0A%20%20%20%20solver_gate_adaptive%20%3D%20AdaptiveSolverCrankNicolson(%0A%20%20%20%20%20%20%20%20t%3D(t_min%2C%20t_max%2C%20dt_gate.value)%2C%0A%20%20%20%20%20%20%20%20x%3D_x%2C%0A%20%20%20%20%20%20%20%20u_initial%3D(1%20%2F%203%20%3C%20_x)%20%26%20(_x%20%3C%202%20%2F%203)%2C%0A%20%20%20%20%20%20%20%20u_boundary%3D(lambda%20t%3A%200%2C%20lambda%20t%3A%200)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20solver_gate_adaptive.solve()%0A%0A%20%20%20%20%23%20Validate%20the%20last%20%60t%60%0A%20%20%20%20solver_gate_adaptive.validate(-1)%0A%20%20%20%20return%20(solver_gate_adaptive%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo%2C%20solver_gate_adaptive)%3A%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20-%20Initial%20%24%5Cmathrm%7B%7Bd%7D%7Dt%20%3D%20%7Bsolver_gate_adaptive.t%5B1%5D%20-%20solver_gate_adaptive.t%5B0%5D%7D%24.%0A%20%20%20%20-%20Final%20%24%5Cmathrm%7B%7Bd%7D%7Dt%20%3D%20%7Bsolver_gate_adaptive.dt%7D%24.%0A%20%20%20%20-%20Final%20%24t%20%3D%20%7Bsolver_gate_adaptive.t%5B-1%5D%7D%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(np%2C%20plt%2C%20solver_gate_adaptive)%3A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plt.subplots(nrows%3D2)%0A%0A%20%20%20%20_axs%5B0%5D.plot(solver_gate_adaptive.t)%0A%20%20%20%20_axs%5B0%5D.set_ylabel(%22%24t%24%22)%0A%0A%20%20%20%20_axs%5B1%5D.semilogy(np.diff(solver_gate_adaptive.t))%0A%20%20%20%20_axs%5B1%5D.set_ylabel(r%22%24%5Cmathrm%7Bd%7Dt%24%22)%0A%0A%20%20%20%20for%20_ax%20in%20_axs%3A%0A%20%20%20%20%20%20%20%20_ax.set_xlabel(%22%23step%22)%0A%20%20%20%20%20%20%20%20_ax.grid(True)%0A%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dt_gate)%3A%0A%20%20%20%20dt_gate%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate_adaptive)%3A%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.t_array()%2C%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.x%2C%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.u_array()%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate_adaptive)%3A%0A%20%20%20%20_t%20%3D%20solver_gate_adaptive.t_array()%0A%20%20%20%20_concerned%20%3D%20(0.1%20%3C%20_t)%20%26%20(_t%20%3C%200.3)%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20_t%5B_concerned%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.x%2C%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.u_array()%5B%3A%2C%20_concerned%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%EF%BC%88%E5%B1%80%E9%83%A8%E6%94%BE%E5%A4%A7%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plt%2C%20solver_gate_adaptive)%3A%0A%20%20%20%20_t%20%3D%20solver_gate_adaptive.t_array()%0A%0A%20%20%20%20_x_range%20%3D%20slice(4%2C%209)%0A%20%20%20%20_t_range%20%3D%20_t%20%3C%200.3%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots()%0A%20%20%20%20_ax.plot(%0A%20%20%20%20%20%20%20%20_t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate_adaptive.u_array()%5B_x_range%2C%20_t_range%5D.T%2C%0A%20%20%20%20%20%20%20%20label%3D%5Bf%22%24x%20%3D%20%7B_x%3A.2f%7D%24%22%20for%20_x%20in%20solver_gate_adaptive.x%5B_x_range%5D%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_ax.set_xlabel(%22%24t%24%22)%0A%20%20%20%20_ax.set_ylabel(%22%24u%24%22)%0A%20%20%20%20_ax.grid(True)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%E4%B8%8D%E8%BF%87%E4%B8%8D%E8%83%BD%E7%9C%8B%E8%AF%AF%E5%B7%AE%EF%BC%8C%E5%9B%A0%E4%B8%BA%E7%9C%9F%E8%A7%A3%E4%B8%8D%E5%A4%AA%E5%A5%BD%E5%86%99%E5%87%BA%E6%9D%A5%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%E8%BF%98%E6%98%AF%E7%9C%8B%E4%B8%80%E4%B8%8B%E8%A7%A3%E5%8E%9F%E9%97%AE%E9%A2%98%E6%97%B6%E7%9A%84%E8%AF%AF%E5%B7%AE%E3%80%82%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(AdaptiveSolverCrankNicolson%2C%20dt%2C%20np%2C%20t_max%2C%20t_min%2C%20x)%3A%0A%20%20%20%20solver_adaptive%20%3D%20AdaptiveSolverCrankNicolson(%0A%20%20%20%20%20%20%20%20t%3D(t_min%2C%20t_max%2C%20dt)%2C%0A%20%20%20%20%20%20%20%20x%3Dx%2C%0A%20%20%20%20%20%20%20%20u_initial%3Dnp.exp(-x)%2C%0A%20%20%20%20%20%20%20%20u_boundary%3D(np.exp%2C%20lambda%20t%3A%20np.exp(t%20-%201))%2C%0A%20%20%20%20)%0A%0A%20%20%20%20solver_adaptive.solve()%0A%0A%20%20%20%20%23%20Validate%20the%20last%20%60t%60%0A%20%20%20%20solver_adaptive.validate(-1)%0A%20%20%20%20return%20(solver_adaptive%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_adaptive%2C%20x)%3A%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_adaptive.t_array()%2C%20x%2C%20solver_adaptive.u_array()%2C%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_adaptive%2C%20x)%3A%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_adaptive.t_array()%2C%20x%2C%20solver_adaptive.error()%2C%20title%3D%22%E8%AF%AF%E5%B7%AE%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(solver_adaptive)%3A%0A%20%20%20%20solver_adaptive.max_error()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%23%20%E6%8C%89%E5%8E%9F%E9%97%AE%E9%A2%98%E7%BB%9F%E8%AE%A1%E6%80%A7%E8%83%BD%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(AdaptiveSolverCrankNicolson%2C%20benchmark%2C%20benchmark_kwargs%2C%20mo)%3A%0A%20%20%20%20with%20mo.persistent_cache(%22stat_adaptive%22)%3A%0A%20%20%20%20%20%20%20%20stat_adaptive%20%3D%20benchmark(AdaptiveSolverCrankNicolson%2C%20**benchmark_kwargs)%0A%20%20%20%20stat_adaptive%0A%20%20%20%20return%20(stat_adaptive%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_benchmark%2C%20stat_adaptive)%3A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plot_benchmark(stat_adaptive)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E7%94%B1%E4%BA%8E%E8%87%AA%E5%8A%A8%E5%A2%9E%E5%A4%A7%20%24%5Cmathrm%7Bd%7Dt%24%EF%BC%8C%E6%97%B6%E9%95%BF%E6%95%B4%E4%BD%93%E5%8F%98%E5%B0%8F%E4%BA%86%EF%BC%8C%E8%80%8C%E8%AF%AF%E5%B7%AE%E5%8D%B4%E6%B2%A1%E6%9C%89%E6%98%8E%E6%98%BE%E5%8F%98%E5%9D%8F%E3%80%82%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20%E6%B3%95%E4%BA%8C%EF%BC%9A%E5%8A%A0%E6%9D%83%E5%B9%B3%E5%9D%87%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%23%20%E5%8D%95%E6%AC%A1%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(SolverCrankNicolson%2C%20np%2C%20override)%3A%0A%20%20%20%20class%20SolverCrankNicolsonWeighted(SolverCrankNicolson)%3A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20post_init(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().post_init()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%B9%A6%E4%B8%8A%E6%9D%83%E9%87%8D%E5%8A%A0%E8%B5%B7%E6%9D%A5%E4%B8%8D%E6%98%AF%E4%B8%80%EF%BC%8C%E4%BC%9A%E5%8F%91%E6%95%A3%EF%BC%9B%E8%BF%99%E9%87%8C%E6%94%B9%E4%BA%86%0A%20%20%20%20%20%20%20%20%20%20%20%20self.weight%20%3D%20np.array(%5B1%2C%202%2C%201%5D)%20%2F%204%0A%0A%20%20%20%20%20%20%20%20%40override%0A%20%20%20%20%20%20%20%20def%20step(self%2C%20t)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().step(t)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20t%20%3E%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.u%5B1%3A-1%2C%20t%5D%20%3D%20self.u%5B1%3A-1%2C%20t%20-%202%20%3A%20t%20%2B%201%5D%20%40%20self.weight%0A%20%20%20%20return%20(SolverCrankNicolsonWeighted%2C)%0A%0A%0A%40app.cell%0Adef%20__(%0A%20%20%20%20SolverCrankNicolsonWeighted%2C%0A%20%20%20%20dt_gate%2C%0A%20%20%20%20np%2C%0A%20%20%20%20t_max%2C%0A%20%20%20%20t_min%2C%0A%20%20%20%20x_max%2C%0A%20%20%20%20x_min%2C%0A)%3A%0A%20%20%20%20solver_gate_weighted%20%3D%20SolverCrankNicolsonWeighted(%0A%20%20%20%20%20%20%20%20t%3Dnp.arange(t_min%2C%20t_max%2C%20dt_gate.value)%2C%0A%20%20%20%20%20%20%20%20x%3Dnp.linspace(x_min%2C%20x_max%2C%2020)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20%E5%8F%A6%E8%AE%BE%E5%88%9D%E5%A7%8B%E6%9D%A1%E4%BB%B6%0A%20%20%20%20solver_gate_weighted.u%5B%3A%2C%200%5D%20%3D%20(1%20%2F%203%20%3C%20solver_gate_weighted.x)%20%26%20(%0A%20%20%20%20%20%20%20%20solver_gate_weighted.x%20%3C%202%20%2F%203%0A%20%20%20%20)%0A%20%20%20%20solver_gate_weighted.u%5B0%2C%20%3A%5D%20%3D%200%0A%20%20%20%20solver_gate_weighted.u%5B-1%2C%20%3A%5D%20%3D%200%0A%0A%20%20%20%20solver_gate_weighted.solve()%0A%20%20%20%20return%20(solver_gate_weighted%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E5%B7%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%B9%B6%E4%B8%8D%E4%B8%A5%E6%A0%BC%E6%BB%A1%E8%B6%B3%EF%BC%8C%E6%95%85%E4%B8%8D%E5%86%8D%60validate%60%E3%80%82%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(dt_gate)%3A%0A%20%20%20%20dt_gate%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate_weighted)%3A%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_gate_weighted.t%2C%0A%20%20%20%20%20%20%20%20solver_gate_weighted.x%2C%0A%20%20%20%20%20%20%20%20solver_gate_weighted.u%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_surface%2C%20solver_gate_weighted)%3A%0A%20%20%20%20_concerned%20%3D%20(0.1%20%3C%20solver_gate_weighted.t)%20%26%20(solver_gate_weighted.t%20%3C%200.3)%0A%20%20%20%20plot_surface(%0A%20%20%20%20%20%20%20%20solver_gate_weighted.t%5B_concerned%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate_weighted.x%2C%0A%20%20%20%20%20%20%20%20solver_gate_weighted.u%5B%3A%2C%20_concerned%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22%E8%BF%91%E4%BC%BC%E8%A7%A3%EF%BC%88%E5%B1%80%E9%83%A8%E6%94%BE%E5%A4%A7%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20invert_t_axis%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plt%2C%20solver_gate_weighted)%3A%0A%20%20%20%20_x_range%20%3D%20slice(4%2C%209)%0A%20%20%20%20_t_range%20%3D%20solver_gate_weighted.t%20%3C%200.3%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots()%0A%20%20%20%20_ax.plot(%0A%20%20%20%20%20%20%20%20solver_gate_weighted.t%5B_t_range%5D%2C%0A%20%20%20%20%20%20%20%20solver_gate_weighted.u%5B_x_range%2C%20_t_range%5D.T%2C%0A%20%20%20%20%20%20%20%20label%3D%5Bf%22%24x%20%3D%20%7B_x%3A.2f%7D%24%22%20for%20_x%20in%20solver_gate_weighted.x%5B_x_range%5D%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_ax.set_xlabel(%22%24t%24%22)%0A%20%20%20%20_ax.set_ylabel(%22%24u%24%22)%0A%20%20%20%20_ax.grid(True)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E6%8C%AF%E8%8D%A1%E5%80%92%E6%98%AF%E6%B2%A1%E4%BA%86%EF%BC%8C%E8%A7%A3%E7%9A%84%E7%9C%9F%E5%AE%9E%E6%80%A7%E5%8D%B4%E4%B9%9F%E5%8F%98%E5%BC%B1%E4%BA%86%E2%80%A6%E2%80%A6%60%E2%95%AE(%E2%95%AF%E2%96%BD%E2%95%B0)%E2%95%AD%60%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%23%20%E6%8C%89%E5%8E%9F%E9%97%AE%E9%A2%98%E7%BB%9F%E8%AE%A1%E6%80%A7%E8%83%BD%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(SolverCrankNicolsonWeighted%2C%20benchmark%2C%20benchmark_kwargs%2C%20mo)%3A%0A%20%20%20%20with%20mo.persistent_cache(%22stat_weighted%22)%3A%0A%20%20%20%20%20%20%20%20stat_weighted%20%3D%20benchmark(SolverCrankNicolsonWeighted%2C%20**benchmark_kwargs)%0A%20%20%20%20stat_weighted%0A%20%20%20%20return%20(stat_weighted%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(plot_benchmark%2C%20stat_weighted)%3A%0A%20%20%20%20_fig%2C%20_axs%20%3D%20plot_benchmark(stat_weighted)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%E5%8A%A0%E6%9D%83%E4%B9%8B%E5%90%8E%E8%AF%AF%E5%B7%AE%E5%A4%AA%E5%A4%A7%E4%BA%86%EF%BC%8C%E5%92%8C%20%24%5Cmathrm%7Bd%7Dx%24%20%E7%9A%84%E5%85%B3%E7%B3%BB%E9%9A%8F%E6%9C%BA%E2%80%A6%E2%80%A6%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20%E9%99%84%E5%BD%95%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(show_files)%3A%0A%20%20%20%20show_files(%5B%22pyproject.toml%22%2C%20%22parabolic_pde.py%22%2C%20%22util.py%22%5D)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
3a31103c03bfa6dcb152f9953653041867aa54ab289c7f5474914e4c9f880bc7