为什么函数传入参数和函数体Block中同名的参数会同时被修改?
mathematica吧
全部回复
仅看楼主
level 4
Clear[EulerLagrange];
Options[EulerLagrange] = {eXpand -> False};
EulerLagrange[density_, depend_List, independ_List, options__] :=
Block[{f0, fh, \[Epsilon], w, y, x$m, expand, euler = {}, wtable},
{expand} = {eXpand} /. {options};
wtable = Table[w[i], {i, 1, Length[depend]}];
f0 = Function[x$m, y + \[Epsilon] w];
ruleg[i_] :=
b_ Derivative[n__][wtable[[i]]][independ] :> (-1)^
Plus @@ {n} HoldForm[\!\(
\*SubscriptBox[\(\[PartialD]\), \(Delete[Thread[{independ, {n}}],
0]\)]b\)];
Do[
fh = density /. depend[[j]] -> f0 /. {x$m -> independ,
y -> depend[[j]] @@ independ, w -> wtable[[j]] @@ independ};
fh = Expand[\!\(
\*SubscriptBox[\(\[PartialD]\), \(\[Epsilon]\)]fh\) /. \[Epsilon] ->
0];
fh = fh /. ruleg[j] /. wtable[[j]] @@ independ -> 1;
AppendTo[euler, fh], {j, 1, Length[depend]}];
If[Not[expand], euler = ReleaseHold[euler], euler]]
f = (\!\(
\*SubscriptBox[\(\[PartialD]\), \(x\)]\(u[x, y, z]\)\))^2 + (\!\(
\*SubscriptBox[\(\[PartialD]\), \(y\)]\(u[x, y, z]\)\))^2 + (\!\(
\*SubscriptBox[\(\[PartialD]\), \(z\)]\(u[x, y, z]\)\))^2
EulerLagrange[f, {u}, {x, y, z}, eXpand -> False]
2021年09月25日 05点09分 1
level 4
2021年09月25日 05点09分 2
为何替换中indpend传入的y和Block中定义的函数y同时被替换?
2021年09月25日 05点09分
@今非昔比_i Block的行为就是如此。你可能想要Module。最正统的做法是另开一个private上下文,Block局域变量为`y,而传入Global`y。
2021年09月28日 14点09分
吧务
level 10
顺便一提,VariationalMethods包有一个列拉格朗日方程的函数。
2021年09月28日 14点09分 3
1