RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1041948
Accepted
jokop
jokop
Asked:2020-11-04 00:55:20 +0000 UTC2020-11-04 00:55:20 +0000 UTC 2020-11-04 00:55:20 +0000 UTC

热传导问题的数值解

  • 772

需要解决管片上的热传导问题 在此处输入图像描述

求解时,我使用了显式方案

N = 10 # максимальное число шагов по х
K = 10 # максимальное число шагов по t
l = 1 # значение х на правой границе
h = l / N # шаг сетки по х
T = 1 # максимальное значение времени t на правой границе
t = T / K # шаг сетки по времени

# зададим сетку 
x_i = np.arange(0, N, h) # значения в узлах по х
t_j = np.arange(0, K, t) # значение в узлах по t
r_j = len(t_j) # количество узлов по t
r_i = len(x_i) # количество узлов по x
w_h_t = np.zeros([r_i, r_j]) # итоговая сетка размером x_i*t_j

# зададим значение функции входящей в начальное уравнение
x = 0
def f(x):
    return np.sin(x)

# граничные условия
ux_0 = 1 # граничное условие на левом конце при x=0
ut_0 = np.cos(x_i) # граничное условие при t=0

# найдем значения на нулевом слое при t=0 ut_0 = np.cos(x_i)
w_h_t[0] = np.cos(x_i)

# найдем значения w_h_t на первом и последующих слоях
const = t / (h**2) 
for j in range(1, len(x_i)-1):
    for i in range(len(w_h_t[j])-1):        
        w_h_t[j+1, i] = w_h_t[j, i] + const * (w_h_t[j,i] - 2*w_h_t[j,i] + w_h_t[j, i-1]) + t*f(x_i[j])
        w_h_t[j+1, 0] = 1
        w_h_t[j+1, len(w_h_t[i])-1] = w_h_t[j+1, len(w_h_t[i])-2] + h * t_j[j+1]


plot_ = np.arange(0,len(w_h_t)-1,1)
for y in plot_:
    plt.plot(x_i, w_h_t[y])

结果,我收到了这样一张关于 X 对网格节点处函数计算值的依赖性的图表

在此处输入图像描述

我不明白我的解决方案有多么错误。寻找私人解决方案时遇到问题,wolframu(x) = 1.54x+1+sinx表示在我看来这不是真的,但我自己无法解决。菲利波夫的教科书中没有类似的例子;我在网上没有找到足够详细的东西来理解解决方案。告诉我在哪里可以找到如何解析地求解这样一个方程以及我的解法有多错误?错误在哪里?除了与解析解进行比较之外,他们通常如何检查此类问题的解的正确性?


总的来说,我明白了。我决定用经过编辑的解决方案来补充我的问题,也许它对某人有用。无法正确找到数值解,但可以通过傅里叶方法(变量分离)找到。最终图表: 在此处输入图像描述

工作代码:

N = 10 # максимальное число шагов по х
K = 500 # максимальное число шагов по t
l = 1 # значение х на правой границе
h = l / N # шаг сетки по х
T = 1 # максимальное значение времени t на правой границе
t = T / K # шаг сетки по времени


# зададим сетку 
x_i = np.arange(0, 1, h) # значения в узлах по х
t_j = np.arange(0, 1, t) # значение в узлах по t
r_j = len(t_j) # количество узлов по t
r_i = len(x_i) # количество узлов по x
w_h_t = np.zeros([r_j, r_i]) # итоговая сетка размером x_i*t_j


# зададим значение функции входящей в начальное уравнение
x = 0
def f(x):
    return np.sin(x)

# граничные условия
ux_0 = 1 # граничное условие на левом конце при x=0
ut_0 = np.cos(x_i) # граничное условие при t=0

# найдем значения на нулевом слое при t=0 ut_0 = np.cos(x_i)
w_h_t[0] = np.cos(x_i)

# найдем значения w_h_t на первом и последующих слоях
const = t / (h**2) 
for j in range(len(w_h_t) - 1):
    for i in range(len(w_h_t[j]) - 1):        
        w_h_t[j + 1, i] = w_h_t[j, i] + const* (w_h_t[j, i+1] - 2 * w_h_t[j, i] + w_h_t[j, i - 1]) + t*f(x_i[i])
        w_h_t[j + 1, 0] = 1
        w_h_t[j + 1, len(w_h_t[i])-1] = w_h_t[j + 1, len(w_h_t[i])-1] + h
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Anton Menshov
    2020-11-04T17:45:26Z2020-11-04T17:45:26Z

    不幸的是,我不是导热率方面的专家,但我可以指出一些确切的问题点:

    1. 目前,时间网格步长与空间网格步长无关。在显式方案中,这会导致不稳定。必须满足CFL 标准。就你而言,如果我没记错热力学,Δt < CFL * χ * (Δx)². 即Δt < (Δx)²(χ - 方程中的辐射扩散 = 1)。在您的程序中,这显然不受特定值或算法的尊重。解决方法:将K两者绑定N。

    2. 很难从您的日程安排中了解正在发生的事情。如果您在单独的图表上绘制每个时间步,您可以看到数值解是发散的。特别是,这可以在您的绘图 ( e121) 中看到。至少可以通过第 1 点进行解释,并且可能还可以通过程序中的其他一些问题来解释。此外,中间步骤的解决方案看起来非常可疑。

    3. 查看值x_i和t_j( print(x_i)) - 现在它们是数组 from 0to 9.9 with step 0.1。从条件来看,步数、步数和右边界是混在一起的。

    现在检查解决方案。形式上,可以通过Method of Manufactured Solutions来检查这样的代码,但是对于您的任务,这当然是太多了。

    在教授数值方法时,最常使用的任务是已知解析解并且已经将获得的结果与其进行比较。也值得一试:

    • 初始条件和最终条件是否满足
    • 收敛性分析(减少了时间步长——它变得更好了吗?减少了空间中的采样步长——它变得更好了吗?)
    • 能量不是突然出现(对于封闭系统)吗?
    • 该解决方案是否与商业\开源模拟器的解决方案相匹配?
    • 如果我们用另一种数值方法(例如,通过有限元方法)求解方程,我们会得到大致相同的结果吗?
    • 5

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5