求助:有关偏微分方程第二第三类边值条件的问题
mathematica吧
全部回复
仅看楼主
level 3
zjnone 楼主
我想用mma求解下面的pde
试着用了一下NDSolveValue:
NDSolveValue[
{-(Derivative[2, 0][u][x, y] + 3*Derivative[0, 2][u][x, y]) == 16,
u[1, y] == 0, Derivative[0, 1][u][x, 1] == -u[x, 1],
Derivative[1, 0][u][0, y] == 0, Derivative[0, 1][u][x, 0] == 0},
u[x, y], {x, 0, 1}, {y, 0, 1}]
但是没能成功求解,看起来是NDSolveValue把第三类边值条件当成第一类了。那要怎样才能正确指定边界条件呢?
2020年06月07日 14点06分 1
level 9
换一下写法就行了,加上狄利克雷和纽曼边界条件。
或者用更普适一点的方法,用有限元画点网格。
我上面输出的结果是,u在(0,0)处的结果,也是u的最大值。
但是很遗憾的是,这个结果是不对的,连不准都说不上。好吧,那用有限差分做一下吧,
毕竟有NSolve函数加持,写起来还是很简单的。
可以看到,结果4.4945。由于边界处精度只有一阶,所以网格至少得有200个,误差才会小于1%,所以这串代码得运行很久,得换个方法加速了。但要追求速度,用mathematica其实没多大意义。
我这里推荐的是一款有限元开源软件FreeFem++,简单实用速度快。计算的结果为,
其中u(0,0)=4.54203,已经收敛到真实解了。取y=x这条线上的值画个图供参考,
总的来说,确实没明白,mathematica内置函数咋就算错了。
2020年06月08日 04点06分 2
非常感谢!我去看了一下NeumannValue的文档,似乎是使用之前需要把方程先转化成某种特定形式?具体可以看一下我下面的回复
2020年06月08日 05点06分
level 3
zjnone 楼主
根据mma的文档,NeumannValue好像需要先把方程转化成标准形式才能使用
这里令v[x, y] = u[x, Sqrt[3] y],
不过老实说我实在没怎么看懂NeumannValue的文档,另外一定要先转化成标准形式再指定Neumann边值实在是有点繁琐了...
2020年06月08日 05点06分 3
确实是这么回事,应该是只有将方程写成张量形式,才有统一的处理方法。这种坐标伸缩变换之前还真没用过,想不到可以用来适应mathematica解方程,真是活久见。
2020年06月08日 06点06分
@逍遥诸葛亮 ……参看 mathematica.stackexchange.com/questions/224812/1871 如果大家想要这个功能,建议正版用户都去客服那里抱怨下。
2020年07月04日 04点07分
1