| 查看: 240 | 回复: 2 | |||
| 当前主题已经存档。 | |||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | |||
[交流]
【求助】请教Mathematica问题!
|
|||
|
下面两段程序,感觉应该是同样的结果,但是却不同。请高手指点! 第一段程序: \!\(\* RowBox[{\(c\_11 = \((2.1`30)\)*10^11; c\_13 = \((1.05`30)\)*10^11; c\_33 = \((2.11`30)\)*10^11; c\_44 = \((0.423`30)\)*10^11;\), "\[IndentingNewLine]", \(e\_15 = \(-0.48`30\); e\_31 = \(-0.573`30\); \ e\_33 = 1.321`30;\), "\[IndentingNewLine]", \(pϵ\_11 = 8.55`30; pϵ\_33 = 10.2`30;\), "\[IndentingNewLine]", \(pρ = 5670`30;\), "\[IndentingNewLine]", RowBox[{\(FPiezo[GC_]\), ":=", RowBox[{"Module", "[", RowBox[{\({Tp, K, DK, a1, a2, a3, a4, b, de, V}\), ",", RowBox[{\(V = GC\), ";", "\[IndentingNewLine]", RowBox[{"K", "=", RowBox[{"(", GridBox[{ {\(c\_11 + c\_44*b\^2 - pρ* V\^2\), \(\((c\_13 + c\_44)\)*b\), \(\((e\_15 + e\_31)\)*b\)}, {\(\((c\_13 + c\_44)\)*b\), \(c\_44 + c\_33*b\^2 - pρ* V\^2\), \(e\_15 + e\_33*b\^2\)}, {\(\((e\_15 + e\_31)\)* b\), \(e\_15 + e\_33*b\^2\), \(-\((pϵ\_11 + pϵ\_33*b\^2)\)\)} }], " "}]}], ";", "\[IndentingNewLine]", \(DK = Det[K]\), ";", "\[IndentingNewLine]", \(a1 = Coefficient[DK, b, 6]\), ";", \(a2 = Coefficient[DK, b, 4]\), ";", \(a3 = Coefficient[DK, b, 2]\), ";", \(a4 = Coefficient[DK, b, 0]\), ";", "\[IndentingNewLine]", \(Tp = Solve[a1\ x^6 + a2\ x^4 + a3\ x^2 + a4 == 0, x]\), "; ", "\[IndentingNewLine]", \(pdecay = Array[de, {1, 6}]\), "; ", "\[IndentingNewLine]", \(Do[pdecay[\([1, m]\)] = Tp[\([m, \ 1, 2]\)], {m, 6}]\), ";", "\[IndentingNewLine]", "pdecay"}]}], "]"}]}], "\[IndentingNewLine]", \(F1[GC_] := Module[{}, temp = FPiezo[GC]; Im[temp[\([1, 1]\)]]]\), "\[IndentingNewLine]", \(Plot[ F1[x], {x, 0, 2000}]\)}]\) 第二段程序: \!\(\* RowBox[{\(c\_11 = \((2.1`30)\)*10^11; c\_13 = \((1.05`30)\)*10^11; c\_33 = \((2.11`30)\)*10^11; c\_44 = \((0.423`30)\)*10^11;\), "\[IndentingNewLine]", \(e\_15 = \(-0.48`30\); e\_31 = \(-0.573`30\); \ e\_33 = 1.321`30;\), "\[IndentingNewLine]", \(pϵ\_11 = 8.55`30; pϵ\_33 = 10.2`30;\), "\[IndentingNewLine]", \(pρ = 5670`30;\), "\[IndentingNewLine]", RowBox[{\(FPiezo[GC_]\), ":=", RowBox[{"Module", "[", RowBox[{\({Tp, K, DK, a1, a2, a3, a4, b, de, V}\), ",", RowBox[{\(V = GC\), ";", "\[IndentingNewLine]", \(Teq = Solve[a1\ x^6 + a2\ x^4 + a3\ x^2 + a4 == 0, x]\), ";", "\[IndentingNewLine]", RowBox[{"K", "=", RowBox[{"(", GridBox[{ {\(c\_11 + c\_44*b\^2 - pρ*V\^2\), \(\((c\_13 + c\_44)\)*b\), \(\((e\_15 + e\_31)\)* b\)}, {\(\((c\_13 + c\_44)\)*b\), \(c\_44 + c\_33* b\^2 - pρ*V\^2\), \(e\_15 + e\_33*b\^2\)}, {\(\((e\_15 + e\_31)\)*b\), \(e\_15 + e\_33*b\^2\), \(-\((pϵ\_11 + pϵ\_33*b\^2)\)\)} }], " "}]}], ";", "\[IndentingNewLine]", \(DK = Det[K]\), ";", "\[IndentingNewLine]", \(Tp = Teq //. {a1 -> Coefficient[DK, b, 6], a2 -> Coefficient[DK, b, 4], a3 -> Coefficient[DK, b, 2], a4 -> Coefficient[DK, b, 0]}\), ";", "\[IndentingNewLine]", \(pdecay = Array[de, {1, 6}]\), ";", "\[IndentingNewLine]", \(Do[pdecay[\([1, m]\)] = \ Tp[\([m, 1, 2]\)], {m, 6}]\), ";", "\[IndentingNewLine]", "pdecay"}]}], "]"}]}], "\[IndentingNewLine]", \(F1[GC_] := Module[{}, temp = FPiezo[GC]; Im[ temp[\([1, 1]\)]]]\), "\[IndentingNewLine]", \(Plot[F1[x], {x, 0, 2000}]\)}]\) 这两段程序的区别是,第一段程序直接求解了一个系数已经确定了的一员六次方程,儿第二段程序是先求解了一个系数待定的一员六次方程再将系数值代入。 [ Last edited by kuhailangyu on 2008-12-10 at 08:18 ] |
» 猜你喜欢
有没有人能给点建议
已经有4人回复
假如你的研究生提出不合理要求
已经有12人回复
实验室接单子
已经有7人回复
全日制(定向)博士
已经有5人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
对氯苯硼酸纯化
已经有3人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
mshwangg
至尊木虫 (正式写手)
- 应助: 206 (大学生)
- 金币: 10702.8
- 散金: 100
- 红花: 19
- 帖子: 597
- 在线: 195.4小时
- 虫号: 576702
- 注册: 2008-06-21
- 专业: 物理学I
★ ★
wuguocheng(金币+2,VIP+0):谢谢参与 8-11 13:02
wuguocheng(金币+2,VIP+0):谢谢参与 8-11 13:02
|
你的问题在于用Solve函数分别作解析解和数值解。而使用Solve函数作解析解不能保证每次求解所得到的解的顺序都是一样的,即第一次求解得到解的顺序是x1,x2,x3,x4,x5,x6,第二次求解是顺序可能变成了x1,x2,x3,x4,x6,x5。另外作解析解和数值解得到的解的顺序也是不一样的。而你的两个程序中都只是选取第一个解作图,显然会得到不一样的结果。你可以自己验证上述说法。 因此,有两个建议:1、做数值解,这样解的顺序能保持一致,而且计算速度快;2、对解出的6个解作合理性判断,舍去不符合要求的解。 |
3楼2009-03-28 17:25:42

2楼2009-03-27 14:58:03












"}]}],
回复此楼