函数定义可以这样写吗?
mathematica吧
全部回复
仅看楼主
level 1
OneBounce[k_, ramp_][{t0_, x0_, xp0_, y0_, yp0_}] :=
Module[{sol, t1, x1, xp1, y1, yp1, gramp, gp},
sol = First[NDSolve[
{x''[t] == 0, x'[t0] == xp0, x[t0] == x0,
y''[t] == -9.8 , y'[t0] == yp0, y[t0] == y0},
{x, y},
{t, t0, \[Infinity]},
Method -> {"EventLocator", "Event" :> y[t] - ramp[x[t]]},
MaxStepSize -> 0.01]];
t1 = InterpolatingFunctionDomain[x /. sol][[1, -1]];
{x1, xp1, y1, yp1} =
Reflection[k, ramp][{x[t1], x'[t1], y[t1], y'[t1]} /. sol];
Sow[{x[t] /. sol, t0 <= t <= t1}, "X"];
Sow[{ y[t] /. sol, t0 <= t <= t1}, "Y"];
Sow[{x1, y1}, "Bounces"];
{t1, x1, xp1, y1, yp1}]
这个是mathematica软件帮助中的一个自定义函数,计算一个小球从一次弹跳到下一次弹跳的解。
这个函数定义中,[k_, ramp_][{t0_, x0_, xp0_, y0_, yp0_}]是两对[]连写在一起的。这种写法很好,能很清晰的看出自变量的分类。
我感到奇怪的是,为什么在帮助里完全查不到这种函数定义写法的说明。都是在函数名后只能跟着一对[]。
2025年04月19日 04点04分 1
level 1
Reflection[k_, ramp_][{x_, xp_, y_, yp_}] :=
Module[{gramp, gp, xpnew, ypnew},
gramp = -ramp'[x];
If[Not[NumberQ[gramp]],
Print["Could not compute derivative "];
Throw[$Failed]];
gramp = {-ramp'[x], 1};
If[ gramp.{xp, yp} == 0,
Print["No reflection"];
Throw[$Failed]];
gp = {1, -1} Reverse[gramp];
{xpnew,
ypnew} = (k/(gramp.gramp)) (gp gp.{xp, yp} - gramp gramp.{xp, yp});
{x, xpnew, y, ypnew}]
这个函数也是这么写的。算反弹后的位置速度。
2025年04月19日 04点04分 2
[真棒]
2025年04月20日 22点04分
level 1
这是运行效果。可以在帮助文件中搜索“弹跳球”关键字,就这一找到这些函数。
2025年04月19日 04点04分 3
level 1
In[172]:= "`*"//Remove;
dfdf[a_][b_][c_][d_]:=a+b+c+d;
dfdf[2][3][1][2]
Out[174]= 8
试过了,不仅可以分成两段,三段、四段都可以。这就很好用了。就是不知道,为什么说明文件里不教这么用。
2025年04月19日 05点04分 4
level 4
你可以这样理解
dfdf是一个未定义的函数或变量
dfdf[x]会返回自身,因为它没有定义
dfdf[x][y]也是如此
但如果给出如下定义:
dfdf[a_][b_][c_][d_]:=a+b+c+d;
那么当我要求Mathematica计算dfdf[2][3][1][2]时,
可以找到与之匹配的定义,从而计算并给出结果为8
如果我再计算比如:dfdf[2][3][1][2][100]
依旧无法找到匹配的定义,原模原样输出dfdf[2][3][1][2][100]
换个例子,我们给出如下定义
c[1]=1
c[2]=2
c[3]=3
然后计算c[4],
当算不出来,未定义呀
如果我这样定义c
c[x_]:=x
那么c[4]就会被计算为4
原因就是可以找到匹配的定义,可以计算
由此,你可以体会一下,何为表达式
一切皆为表达式
2025年04月24日 05点04分 5
level 1
理解了,我的意思是说,只有mathematica这种软件才具有这样的用法。它应该在说明书中讲得更明确一点。
2025年04月24日 13点04分 6
level 1
那么引申一下,mathematica软件能这样用,是因为它是函数式编程软件,还是因为它是符号计算软件的原因?
2025年04月24日 13点04分 7
level 1
感觉应该式函数式编程语言的原因吧!当然这只是盲猜,我对函数式编程语言并不了解。应不是符号计算软件的原因,maple也是符号计算软件,maple能这样用吗?
2025年04月24日 13点04分 8
吧务
level 15
这种定义其实是给符号添加了一个subvalue,参看SubValues的自带帮助。不过自带帮助的“定义函数”教程部分好像是没提这个。Leonid Shifrin那书倒是开篇就讲了,我自己也是从Leonid的书里正式学到了这个。
然后,这种定义其实有个限制(或许我该叫它特性?),那就是,用它定义的函数只能部分地获得属性。一个例子:
ClearAll[f];
SetAttributes[f, HoldAll];
f[1 + 2][3 + 4]
(* f[1+2][7] *)
f[1 + 2, 3 + 4]
(*
f[1 + 2, 3 + 4]
*)
不知道我在说啥可以先别管,这算高级内容。
2025年05月03日 14点05分 9
1