Mathematica语法还是新手。当我这样做时:
DSolve[{
D[u[x, t], {x, 2}] == (1/(v*v))*D[u[x, t], {t, 2}],
u[0, t] == 0,
u[l, 0] == 0
}, u, {x, t}]
它只返回我输入的内容
DSolve[{(u^(2,0))[x,t]==(u^(0,2))[x,t]/v^2,u[0,t]==0,u[l,0]==0},u,{x,t}]
然而,当我删除边界条件时,我得到了
{{u->Function[{x,t},C[1][t-(Sqrt[v^2] x)/v^2]+C[2][t+(Sqrt[v^2] x)/v^2]]}}
用C [1]和C [2]表示边界条件的函数。
任何人都知道为什么会这样吗?
答案 0 :(得分:5)
2件事:
难道你不需要比2更多的边界和初始条件吗?您在左侧和右侧有二阶导数,每个都需要2个条件。因此,总数为4.请参阅http://mathworld.wolfram.com/WaveEquation1-Dimensional.html
我认为DSolve或NDSolve不能解决初始值和边值问题吗?我似乎已经在某个地方读过这个了。现在没时间检查。
答案 1 :(得分:2)
我认为Mathematica不知道如何处理2nd order PDEs的这些边界条件。你想怎么回答这个问题?作为一般的傅立叶级数?
这是mentioned in the Mathematica Cookbook(可能还有其他地方)......
分解Mathematica的问题(使用维度因子v->1
),你会发现
In[1]:= genSoln = DSolve[D[u[x, t], {x, 2}] == D[u[x, t], {t, 2}], u, {x, t}] // First
Out[1]= {u -> Function[{x, t}, C[1][t - x] + C[2][t + x]]}
In[2]:= Solve[u[0, t] == 0 /. genSoln]
Out[2]= {{C[1][t] -> -C[2][t]}}
In[3]:= u[l, 0] == 0 /. genSoln /. C[1][x_] :> -C[2][x] // Simplify
Out[3]= C[2][-l] == C[2][l]
该解决方案写为f(t-x)-f(t+x)
,其中f
定期超过[-l,l]
...
如果不对解决方案的顺畅性做出假设,就不能再做了。
您可以检查标准傅立叶级数方法是否有效,例如
In[4]:= f[x_, t_] := Sin[n Pi (t + x)/l] - Sin[n Pi (t - x)/l]
In[5]:= And[D[u[x, t], {x, 2}] == D[u[x, t], {t, 2}],
u[0, t] == 0, u[l, 0] == 0] /. u -> f // Reduce[#, n] & // Simplify
Out[5]= C[1] \[Element] Integers && (n == 2 C[1] || n == 1 + 2 C[1])