« first day (7 days earlier)    last day (15 days later) » 

12:52 AM
对,本征值取负号就行了。麻烦不在这里
 
 
4 hours later…
4:38 AM
他的程序还是有问题,我觉得。因为计算TE和TM模式的时候似乎不太对
 
 
1 hour later…
5:42 AM
@yulinlinyu ……可他后面验算的时候没有取负号啊
 
6:38 AM
那个不是问题。你写出方程一看就明白了。
 
7:03 AM
Laplacian[u[x,y],{x,y}]+k^2*u[x,y]=beta^2*u[x,y]等价于-Laplacian[u[x,y],{x,y}]-k^2*u[x,y]=-beta^2*u[x,y]
matlab的PDE工具箱熟悉吗?我用它来验证mma的计算结果,发现我还没用对。不知道那里出问题了。help里也没找到相应的说明
 
 
3 hours later…
10:16 AM
@yulinlinyu ……是啊,是等价啊,但是这样他算出来的其实是-beta^2,验算的时候就应该再加一次负号,也就是Sqrt[-(val+b^2)],而他用的是Sqrt[vals + b^2],这怎么不是问题。
事实上,如果不用这个加了负号的式子,这个算法是无论如何都“凑”不出5.336的
@yulinlinyu 我对MATLAB一窍不通。
 
10:55 AM
还有,其实我也把5.336给“凑”出来了,但是相应的特征函数图形很奇怪,我对结果可靠性没什么把握,所以就没发。
 
 
1 hour later…
12:01 PM
怎么凑的?私下发给我?
 
就是直接用频域的Maxwell方程去解
当然我用的是FDM
因为这样推出来的方程含了对系数的导数
FEM我不知道怎么整合成合适的形式
 
是否方便把代码发给我学习一下?
 
等我把这波算完
我看看有没有更好的参数
大概还要六七分钟吧
——计算成本有点高嗯。
 
我用FEM的目的是想解决任意横截面波导模场和传播常数的求解问题。取光纤是为了与解析解比较
 
嗯,但是这不连简单情形都还没搞定吗……所以我想试下是不是方程形式的问题
 
12:05 PM
Alex的方法对于非圆形波导我就不敢肯定能不能用了
 
我觉得他那个就是硬凑出来的……
不加负号的话算不出5.336
稍加实验就会发现Tanh是多余的,b其实也是多余的
 
正号也没问题啊
 
算不出来
 
Tanh是多余的。但是b的作用在于便于找出对应的本征值
 
反正我试了几次都不行
不用b也算得出来,关键的就是那个负号
根本就是歪打正着
 
12:07 PM
他的b取得不好。我取了b=glass*k0,就是第一个根
我把我的程序发给你。
 
网格疑似有一定的影响,但是主要的还是那个负号
 
去了正号之后,后边的形式要改一下
实际上就是原来方程的变形。只是那个l^2/r^2我想不明白
`rcore = 0.8; rclad = 4.;
rootNum = 10; om = 0.0; orbitNum = 1;

glass = 1.45; air = 1.; \[Lambda] = 1.55;
k0 = (2 \[Pi])/\[Lambda]; b = k0*glass;

reg = ImplicitRegion[x^2 + y^2 <= rclad^2, {x, y}]; f =
Function[{vertices, area}, Block[{x, y}, {x, y} = Mean[vertices];
If[x^2 + y^2 <= rcore^2, area > 0.001, area > 0.01]]];
mesh = ToElementMesh[reg, MeshRefinementFunction -> f];

\[Epsilon][x_, y_] := If[x^2 + y^2 <= rcore^2, glass^2, air^2]

helm = \!\(
\*SubsuperscriptBox[\(\[Del]\), \({x, y}\), \(2\)]\(u[x,
他用b这一项的思路是对的,便于找到合理的本征值
否则可能需要在80个本征值里找,太麻烦
 
curl = Curl[#, {x, y, z}(*,"Cylindrical"*)] &;
elst = e[#][x, y, z] & /@ Range[3];
hlst = h[#][x, y, z] & /@ Range[3];

eq = Thread /@ {curl@elst == -I w mu hlst, curl@hlst == I w eps elst}

eq2D = eq /. (h : e | h)[i_] :> Function[{x, y, z}, h[i][x, y] Exp[I beta z]] /. z -> 0

mid = eq2D /.
  Derivative[index__][head_][xy__] :> d[head[xy], Sequence @@ Transpose@{{x, y}, {index}}]

mid2 = Flatten@(mid[[All, 1 ;; 2]] /.
      Solve[mid[[All, -1]], #[3][x, y] & /@ {e, h}][[1]] /. eps -> eps[x, y] /. d -> D)
 
还有,他om这一项尽管没起作用,但看的出来,他对物理有比较好的理解。而user21可能对FEM算法较熟,对物理不一定比Alex强
 
代码没整理,凑和着看吧……应该还算勉强能看……
用了pdetoae
最后算特征值成本比较高,因为生成的阵不是对称阵。(不懂是为啥……)
八核并行跑了五六分钟
不过倒不怎么耗内存好像
 
12:18 PM
你的代码已经到了高手的段位了,赞!
 
差分阶用4阶是基于这帖的经验:mathematica.stackexchange.com/a/129574/1871 换句话说,没啥理论依据……
@yulinlinyu 也就这点拿得出手了……
我其实不完全确定前面的方程推导部分是否完全无误……
也算检查了几遍,没发现错误,可为什么算出来的特征函数图形怎么怪……
!改漏了一个
最后的beta
beta -> Sqrt@vallst[[1]] 里面的1要变5
还有,计算区域的大小对结果也是有影响的。
不过在这套方法里,要算出28附近的特征值是轻轻松松。(有意义吗?)
——你刚贴的代码是基于Alex的第二段代码的,在不使用orbitNum^2/(x^2 + y^2)这一项的情况下,你还算得出5.336吗?
 
算不出来。一定要有这一项。所以我不理解为啥
而且5.336这个值他也是说说的。他自己的代码也算不出来5.336
 
所以说我觉得他那个就是………………
 
12:34 PM
那一项物理上没道理。至少我想不出来。
哥们儿,你的程序功力极其深厚,佩服!
 
 
你还是在校学生吗?太厉害了
 
嗯,我还在读。
 
主业是工科,业余搞搞mma?
是否研究工作要搞数值计算?
 
12:49 PM
只是要用到一些数值计算。终究还是工科。
我这其实算是在mma上花的时间有些太多了。
 
是否方便告知你的研究工作?能否来清华做个报告?
 
在Stackexchange上解微分方程在很大程度上成了我的兴趣……
@yulinlinyu 哈……不敢不敢。
——我算是搞化学的。
 
你这个兴趣高端!
我是学光学的。博士毕业已10多年了
我觉得你是一个有天赋的人,佩服
 
过奖过奖
——话说我也找了台装了Comsol的电脑翻了下帮助,感觉它的帮助似乎暗示Comsol的求解就是基于频域的Maxwell方程的
Comsol帮助列的是那个含两个curl的形式
但是从那个形式出发,不好化……
好像没法简单地整理成特征值计算所需要的那个形式……
 
Comsol应该是用有限元求解的吧?
有限元解波导问题的论文倒是有。可惜我看不懂
 
1:02 PM
但是有限元也要从某个特定方程出发去推弱形式的吧……当然我也不太懂……
 
本征函数不对
 
所以我不敢把这个当答案贴出去……
 
你的程序我还没看明白。感觉像是从麦克斯韦方程重新推导了一遍公式,然后整理成求本征值的微分方程形式?
 
eq是一般形式的频域Maxwell方程组
eq2D是去掉了z方向分量的方程组
 
这个频域的形式在其他横截面的波导也适用吗?如果只能解圆波导,意义就不大了
 
1:06 PM
midDerivative换成D存粹是为了方便下面消元。
——适用的吧?波导分析就是把z方向变化搞掉就行吧?
导出eq2D用的就是分离变量的换元啊
 
如果适用的话,那是有意义的。Comsol最大的好处我认为在于,任意横截面波导,只需要设定横截面的折射率分布,它都可以求解。
 
mid2消掉了Ez和Hz(代码里用e[3]h[3]表示)
 
我本想用mma实现这一点,结果我发现根本搞不定
 
lhs进一步消掉了Hx和Hy(代码里用h[1]h[2]表示),并且整理成了求解特征值所需的标准形式
我觉得这个推导过程应该是没问题的……
 
应该是没啥问题。
 
1:22 PM
\[Epsilon]已经视作了x和y的函数,所以这次连续性应该被包括进去了,可是为什么算不对……
是差分格式的问题吗……
 
话说我原贴里的方程,∇^2{x,y}E[x,y]+(ϵ(2π/λ)^2)*E[x,y]=β^2*E[x,y],应该也没啥问题啊
 
海姆霍兹方程推导的时候是把
\[Epsilon]当常数的吧好像
否则\[Epsilon]挪不到合适的位置
 
除了界面处,其他地方确实是常数啊
 
就是界面处的问题吧
热传导的热流连续问题有类似的坑
分段连续的系数位置不能随便动,否则连续性会出问题
——贴吧里本来有个相关的问题,但是这会儿被百度隐藏了
17年1月前的帖子不知要到猴年马月才恢复……
 
经过你的提醒,我专门翻了光波导的书。但是没看明白
我完全是个数学渣渣啊,气人
 
1:35 PM
相关的教材好像也不怎么讨论数值计算……?
 
你说的对。Alex的答案是有问题的。只有当l=1的时候,近似程度不错,其他情况下,比如l=0和l=2时,误差都很大。
是的。光学的书里,只告诉你物理上怎么回事情。怎么求解是不管的。
 
哈……
 
1:55 PM
现在看来,Eigensystem完全可以替代matlab的PDE工具箱。只是要能赶上comsol的功能,还得做很多事情。我先下了
 

« first day (7 days earlier)    last day (15 days later) »