找回密码
 注册
Simdroid-非首页
查看: 273|回复: 6

[基础概念] 【来道小题】把matlab语言写的表达式转化为mmtc的表达式

[复制链接]
发表于 2010-4-19 19:54:40 | 显示全部楼层 |阅读模式 来自 黑龙江哈尔滨
悬赏10仿真币已解决
本帖最后由 TBE_Legend 于 2010-4-19 19:59 编辑

【实用编程】

1 。把matlab语言写的表达式转化为mmtc的表达式
  1. f=(r*sin(A)-rho*sin(3*B))*(cos(beta)-sin(beta)*cos(3*B)-sin(beta)*sin(3*B)*tan(B))-(r*cos(A)-rho*cos(beta)*cos(3*B))*tan(B)
复制代码
把f变成mmtc的表达式。如:sin(A)->Sin[A]


2。 代码。易读第一,通用第二,简介第三。

3。 题目来自:http://bbs.simwe.com/thread-927096-1-1.html

最佳答案

查看完整内容

下面是我写的代码:下面是Mathematica 自带的函数:
发表于 2010-4-19 19:54:41 | 显示全部楼层 来自 北京
Simdroid开发平台
下面是我写的代码:
  1. In[280]:=
  2. str1 = "(r*sin(A)-rho*sin(3*B))*(cos(beta)-sin(beta)*cos(3*B)-sin(\
  3. beta)*sin(3*B)*tan(B))-(r*cos(A)-rho*cos(beta)*cos(3*B))*tan(B)";
  4. char1 = Characters@str1;
  5. len1 = Length@char1;
  6. yusuanfu = {"+", "-", "*", "/", "^"};
  7. zimubiao = Table[FromCharacterCode[i + 96], {i, 1, 26}];
  8. For[j = 2, j <= len1, j++,
  9. If[char1[[j]] == "(" && ! MemberQ[yusuanfu, char1[[j - 1]]],
  10.    char1[[j]] = "["
  11.    ];
  12. ]
  13. pos2 = Flatten[Position[char1, "["]];
  14. len2 = Length@pos2;
  15. For[j = 1, j <= len2, j++,
  16.   For[k = pos2[[j]] + 1; cnt = 0, k <= len1, k++,
  17.            If[char1[[k]] == "(", cnt += 1];
  18.            If[char1[[k]] == ")",
  19.     If[cnt == 0, char1[[k]] = "]"; Break[], cnt -= 1];];
  20.    ];
  21.   For[k = pos2[[j]] - 1, k >= 1, k--,
  22.    If[! MemberQ[zimubiao, char1[[k]]],
  23.      char1[[k + 1]] =
  24.       FromCharacterCode[ToCharacterCode[char1[[k + 1]]] - 32];
  25.      Break[]];
  26.    ]
  27.   ];
  28. ToExpression@StringJoin@char1

  29. Out[289]= -(r Cos[A] - rho Cos[3 B] Cos[beta]) Tan[
  30.    B] + (r Sin[A] - rho Sin[3 B]) (Cos[beta] - Cos[3 B] Sin[beta] -
  31.     Sin[3 B] Sin[beta] Tan[B])
复制代码
下面是Mathematica 自带的函数:
  1. In[290]:= str1 = \
  2. "(r*sin(A)-rho*sin(3*B))*(cos(beta)-sin(beta)*cos(3*B)-sin(beta)*sin(\
  3. 3*B)*tan(B))-(r*cos(A)-rho*cos(beta)*cos(3*B))*tan(B)"; \
  4. ToExpression[str1, TraditionalForm]

  5. Out[290]= -(r Cos[A] - rho Cos[3 B] Cos[beta]) Tan[
  6.    B] + (r Sin[A] - rho Sin[3 B]) (Cos[beta] - Cos[3 B] Sin[beta] -
  7.     Sin[3 B] Sin[beta] Tan[B])
复制代码
回复

使用道具 举报

发表于 2010-4-20 09:03:05 | 显示全部楼层 来自 江苏苏州
代码太长了。
唉,要是 Tau 在的话,绝对不能容忍这样冗长的 M@ 代码。
回复

使用道具 举报

发表于 2010-4-20 09:12:11 | 显示全部楼层 来自 北京
本帖最后由 ggggwhw 于 2010-4-20 13:56 编辑

为了避免垒砖之嫌,我删去了下面的哪些没有用的帖子只剩下了最后的结果.为了不产生意外的结果,需要注意:
(1)不能省略乘号,至少应该将乘号写成*或者×或者"空格"的形式;
(2)所有的自定义函数需要首字母大写.
下面是我写的代码:
  1. In[427]:= Biaozhun // Remove
  2. Biaozhun[str1_] :=
  3.   Module[{char1, len1, yunsuanfu, zimubiao, pos2, len2, cnt, j, k},
  4.    char1 = Characters[str1];
  5.    len1 = Length[char1];
  6.    yunsuanfu = {"+", "-", "*", "/", "^", "(", ")", "[", "]", "{", "}",
  7.       " ", "\[Times]", "\n"};
  8.    zimubiao =
  9.     Flatten[Table[{FromCharacterCode[i + 64],
  10.        FromCharacterCode[i + 96]}, {i, 1, 26}]];
  11.    For[j = 2, j <= len1, j++,
  12.     If[char1[[j]] == "(" && ! MemberQ[yunsuanfu, char1[[j - 1]]],
  13.       char1[[j]] = "["];];
  14.    pos2 = Flatten[Position[char1, "["]
  15.      ];
  16.    len2 = Length@pos2;
  17.    For[j = 1, j <= len2, j++,
  18.     For[k = pos2[[j]] + 1; cnt = 0, k <= len1, k++,
  19.      If[char1[[k]] == "(", cnt += 1];
  20.      If[char1[[k]] == ")",
  21.       If[cnt == 0, char1[[k]] = "]"; Break[], cnt -= 1];];];
  22.     For[k = pos2[[j]] - 1, k >= 1, k--,
  23.        If[! MemberQ[zimubiao, char1[[k]]],
  24.       char1[[k + 1]] = ToUpperCase[char1[[k + 1]]]; Break[];];
  25.      If[k == 1, char1[[k]] = ToUpperCase[char1[[k]]]; Break[];];
  26.      ];
  27.     ];
  28.    ToExpression[StringJoin[char1]]
  29.    ];
  30. str = "(r*sin(A)-rho*sin(3*B))*(cos(beta)-sin(beta)*cos(3*B)-sin(beta)
  31.   *sin(3*B)*tan(B))-(r*cos(A)-rho*cos(beta)*cos(3*B))*tan(B)";
  32. Biaozhun[str]
  33. Out[430]= -(r Cos[A] - rho Cos[3 B] Cos[beta]) Tan[
  34.    B] + (r Sin[A] - rho Sin[3 B]) (Cos[beta] - Cos[3 B] Sin[beta] -
  35.     Sin[3 B] Sin[beta] Tan[B])
复制代码
下面是Mathematica 自带的函数:
  1. In[290]:= str1 = \
  2. "(r*sin(A)-rho*sin(3*B))*(cos(beta)-sin(beta)*cos(3*B)-sin(beta)*sin(\
  3. 3*B)*tan(B))-(r*cos(A)-rho*cos(beta)*cos(3*B))*tan(B)"; \
  4. ToExpression[str1, TraditionalForm]

  5. Out[290]= -(r Cos[A] - rho Cos[3 B] Cos[beta]) Tan[
  6.    B] + (r Sin[A] - rho Sin[3 B]) (Cos[beta] - Cos[3 B] Sin[beta] -
  7.     Sin[3 B] Sin[beta] Tan[B])
复制代码
回复

使用道具 举报

发表于 2010-4-20 09:15:04 | 显示全部楼层 来自 江苏苏州
g, 为何不用 ReplaceAll ?
string/.sin(A)->Sin[A]
回复

使用道具 举报

发表于 2010-5-2 01:25:02 | 显示全部楼层 来自 浙江嘉兴
楼上,别的函数呢,replaceall好像不能解决根本问题
回复

使用道具 举报

发表于 2013-5-16 10:56:28 | 显示全部楼层 来自 陕西咸阳
今天终于用到以前写的函数了,不过发现了个小问题,修改了.再加上word中写的宏,
算是完美了.
分两步,
第一步将matlab表达式复制到word中,运行宏,进行格式初步转换,
第二步,将word中的结果复制到mathematica 中运行函数,进行第二次转换,
搞定!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-19 16:19 , Processed in 0.039218 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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