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

[符号计算] 解方程组后如何通过循环得到各变量的表达式?

[复制链接]
发表于 2011-8-31 23:28:06 | 显示全部楼层 |阅读模式 来自 湖北武汉
  1. myList = {x, y}
  2. sol = Solve[{x + y == a - b, 2 x - y == a + 3 b}, myList]
  3. Do[myList[[N]] = myList[[N]] /. sol[[1]], {N, 1, 2}]
复制代码
现在我想在解出方程组后通过循环得到myList中各个变量的表达式,为什么最后这个循环运行后没有反应?

不使用循环的情况下,我使用这样的语句是可以的:
  1. myList[[1]]=myList[[1]]/.sol[[1]]
  2. myList[[2]]=myList[[2]]/.sol[[1]]
复制代码

这两句和上面的循环不是同样的意思吗?

发表于 2011-9-1 02:45:02 | 显示全部楼层 来自 北京
Simdroid开发平台
因为Do返回Null,所以你看不见输出

Unless an explicit Return is used, the value returned by Do is Null.
回复 不支持

使用道具 举报

发表于 2011-9-1 02:46:50 | 显示全部楼层 来自 北京
想看见输出,加上Print
  1. Do[Print[myList[[N]] = myList[[N]] /. sol[[1]]], {N, 1, 2}]
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2011-9-1 06:37:12 | 显示全部楼层 来自 湖北武汉
guocong89 发表于 2011-9-1 02:46
想看见输出,加上Print

感谢版主!

使用您说的办法的确可以看到输出了。可是,这还是没有完全达到我的目标。我最终想得到的是x,y的表达式,以便用于下一步的计算。比如:
  1. x=(2 (a+b))/3
  2. y=1/3 (a-5 b)
复制代码
在我的工作中,通常方程组和变量都比较多,在解完方程组以后,如果使用以下方式:
  1. x=x/.sol
  2. y=y/.sol
复制代码
来获得x, y的表达式,非常麻烦。因此前面想使用一个循环来解决这个问题。现在您已经给解决了显示的问题,还请您继续指点,解决如何简单地获得各个变量的表达式的问题。

再次感谢!
回复 不支持

使用道具 举报

发表于 2011-9-1 09:02:53 | 显示全部楼层 来自 台湾
本帖最后由 chungyuandye 于 2011-9-1 09:03 编辑
  1. myList = {x, y};
  2. ans = myList /.Solve[{x + y == a - b, 2 x - y == a + 3 b}, myList][[1]];
  3. MapThread[Set, {myList, ans}]
  4. {x,y}
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-9-1 11:02:04 | 显示全部楼层 来自 河南
版主还是很尽心的。。。感谢。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-9-1 22:31:48 | 显示全部楼层 来自 湖北武汉
chungyuandye 发表于 2011-9-1 09:02

非常感谢您的回答!您的回答已经解决了我的问题。

不过,在我的工作中,x,y等变量的表达式都是极为复杂的,需要对它们先Together后Simplify的操作。请问该如何一次性地得到各个变量化简后的表达式呢?这些表达式我还要用于后续的计算的。

再次感谢!期望着您和其他各位高手的回答。
回复 不支持

使用道具 举报

发表于 2011-9-4 00:25:34 | 显示全部楼层 来自 台湾
本帖最后由 chungyuandye 于 2011-9-4 00:29 编辑
20wangz 发表于 2011-9-1 22:31
非常感谢您的回答!您的回答已经解决了我的问题。

不过,在我的工作中,x,y等变量的表达式都是极为复杂 ...
  1. obj = Exp[x + y]
  2. Clear[x, y];
  3. myList = {x, y};
  4. ans1 = myList /.Simplify@Solve[{x + y == a - b, 2 x - y == a + 3 b}, myList][[1]];
  5. MapThread[Set, {myList, ans}];
  6. {x, y}
  7. obj
  8. Clear[x, y];
  9. ans2 = Simplify@Solve[{x + y == a - b, 2 x - y == a + 3 b}, myList][[1]];
  10. ans2
  11. obj /. ans2
复制代码

將Simplify加在Solve之前即可!
不過因為後續還要計算,將Solve的結果指定給個變量並無太大的實質意義。
不如先將Solve計算的結果保留,要做計算時在利用Solve保留Rule的特性以Replace的方式作用到計算的對象上。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-9-5 22:30:17 | 显示全部楼层 来自 湖北武汉
chungyuandye 发表于 2011-9-4 00:25
將Simplify加在Solve之前即可!
不過因為後續還要計算,將Solve的結果指定給個變量並無太大的實質意義。
...

非常感谢!

我再好好体会一下,希望能就些找到一些规律性的东西。

再次感谢!
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 02:45 , Processed in 0.039965 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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