找回密码
 欢迎注册
楼主: zhouguang

[讨论] 关于Mathematica软件的命令使用的讨论

[复制链接]
发表于 2013-11-4 15:09:57 | 显示全部楼层
mathematica 发表于 2013-11-4 14:33
第二个版本的代码
(*利用递归解决问题!*)
Clear["Global`*"];(*Clear all variables*)

这个实现不错,改写一下:
  1. Clear["`*"];
  2. fun[{x_, xs___}] := Prepend[fun /@ {xs}, fun@x]
  3. fun[x_] := FromCharacterCode@x
  4. si = {{65, {66, {70}, 69}}, 67};
  5. fun /@ si
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 16:08:09 | 显示全部楼层

@Mathematica,似乎没什么解释的,主要就模式匹配和RuleBased,不熟悉的符号或函数,按F1看看,然后试几个例子就明白了,判断整数是或小数的试试IntegerQ,NumericQ,Element,NumberQ等

点评

其实mathematica与lisp差不多,只不过mathematica用的是大括号,而lisp用的是小括号  发表于 2013-11-4 20:18
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 16:29:00 | 显示全部楼层
chyanog 发表于 2013-11-4 16:08
@Mathematica,似乎没什么解释的,主要就模式匹配和RuleBased,不熟悉的符号或函数,按F1看看,然后试几 ...

@chyanog
代码1:
If[ListQ@#,#,FromCharacterCode@#]&//@{{65, {66, {70}, 69}}, 67}
代码2:
If[Not@IntegerQ@#,#,FromCharacterCode@#]&//@{{65, {66, {70}, 69}}, 67}

你觉得这个如何?

点评

这个也不错  发表于 2013-11-4 16:31
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 16:31:25 | 显示全部楼层
chyanog 发表于 2013-11-4 16:08
@Mathematica,似乎没什么解释的,主要就模式匹配和RuleBased,不熟悉的符号或函数,按F1看看,然后试几 ...

不可否认,这个也马马虎虎是一种新的代码,虽然是"抄袭"你的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 22:05:37 | 显示全部楼层
mathematica 发表于 2013-11-4 16:29
@chyanog
代码1:
If&//@{{65, {66, {70}, 69}}, 67}


有点大动干戈了吧.
本质上就是让FromCharacterCode 具有 Listable 的属性.所以:

  1. SetAttributes[FromCharacterCode, Listable];
  2. FromCharacterCode[si]
复制代码

点评

学到了一招!  发表于 2013-11-5 09:11

评分

参与人数 1威望 +2 经验 +2 鲜花 +2 收起 理由
chyanog + 2 + 2 + 2

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 22:21:24 | 显示全部楼层
zeroieme 发表于 2013-11-4 13:25
借楼提问:
怎么让Mathematica求多元多项式的指数
比如a x y + x 以x、y为未知数。Exponent[a x y + x, { ...


既然Mathematica的 Exponent不支持多元函数,我们不妨自己写一个.
基本思路 就是获取所有的项,然后将所有自变量赋成一个变量,再用Exponent.
  1. f = Max[Exponent[MonomialList[#] /. Thread[{x, y} -> t], t]] &
复制代码


MonomialList有一个用来排序的选项,可以按照 total degree来排序, 排序完第一个就是最高次项了.
  1. MonomialList[#, {x, y}, "DegreeLexicographic"]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-5 09:11:09 | 显示全部楼层
  1. Map[If[ListQ@#, #, FromCharacterCode@#] &, {{65, {66, {70}, 69}},
  2.   67}, Infinity]
复制代码

这也是一种办法!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-6 11:48:58 | 显示全部楼层
wayne 发表于 2013-11-4 22:21
既然Mathematica的 Exponent不支持多元函数,我们不妨自己写一个.
基本思路 就是获取所有的项,然后将所 ...

但MonomialList容易溢出

点评

mathematica软件也会溢出吗?mathematica不是计算任意大小的数字都可以吗?  发表于 2013-11-6 12:47
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-10 11:45:36 | 显示全部楼层
zeroieme 发表于 2013-11-6 11:48
但MonomialList容易溢出


我测试了一下,发现3^2000项,前面提供的代码,MonomialList 运行需要55秒钟,
而下面的代码需要41秒钟
  1. eqs = (a x y + y + x)^2000;
  2. Total[First[CoefficientRules[eqs, {x, y}, "DegreeLexicographic"][[All, 1]]]]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-10 11:48:28 | 显示全部楼层
其实我们完全没必要展开所有的项.
只需要计算 每一个 参与乘积的因子的最高次幂就行了.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-7 05:23 , Processed in 0.024106 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表