网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月20日漏签0天
mathematica吧 关注:19,856贴子:74,010
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 9回复贴,共1页
<<返回mathematica吧
>0< 加载中...

函数定义可以这样写吗?

  • 只看楼主
  • 收藏

  • 回复
  • go活宝哈哈
  • 安装激活
    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_}]是两对[]连写在一起的。这种写法很好,能很清晰的看出自变量的分类。
我感到奇怪的是,为什么在帮助里完全查不到这种函数定义写法的说明。都是在函数名后只能跟着一对[]。


  • go活宝哈哈
  • 安装激活
    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-08-20 19:39:56
广告
不感兴趣
开通SVIP免广告
  • go活宝哈哈
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是运行效果。可以在帮助文件中搜索“弹跳球”关键字,就这一找到这些函数。


  • go活宝哈哈
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
In[172]:= "`*"//Remove;
dfdf[a_][b_][c_][d_]:=a+b+c+d;
dfdf[2][3][1][2]
Out[174]= 8
试过了,不仅可以分成两段,三段、四段都可以。这就很好用了。就是不知道,为什么说明文件里不教这么用。


  • 王云飞的天空
  • 还分不清
    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
原因就是可以找到匹配的定义,可以计算
由此,你可以体会一下,何为表达式
一切皆为表达式


  • go活宝哈哈
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
理解了,我的意思是说,只有mathematica这种软件才具有这样的用法。它应该在说明书中讲得更明确一点。


  • go活宝哈哈
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
那么引申一下,mathematica软件能这样用,是因为它是函数式编程软件,还是因为它是符号计算软件的原因?


  • go活宝哈哈
  • 安装激活
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
感觉应该式函数式编程语言的原因吧!当然这只是盲猜,我对函数式编程语言并不了解。应不是符号计算软件的原因,maple也是符号计算软件,maple能这样用吗?


2025-08-20 19:33:56
广告
不感兴趣
开通SVIP免广告
  • xzcyr
  • 吧主
    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]
*)
不知道我在说啥可以先别管,这算高级内容。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回mathematica吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示