注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

详解Mathematica中的Solve和NSolve  

2012-01-13 19:36:08|  分类: M&M |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

用于求解代数方程,注意这里的方程要写出逻辑等式即lhs==rhs

1.Solve[方程]
针对方程中只有一个变量的情形,例如:
输入:Solve[8 x - 9 == 3 x + 26]
输出:{{x -> 7}}
2.Solve[方程,变量]
用于方程中有多个变量,需要指定,对于单个变量的方程你当然也可以指定,只是略显多余,但是可读性稍好。例如:
输入:Solve[a x + b y == c x + d y, y]
输出:{{y -> (-a x + c x)/(b - d)}}
如果不指定变量,Mathematica会将第一个符号作为未知量,例如:
输入:Solve[a x + b y == c x + d y]
输出:{{a -> (c x - b y + d y)/x}, {b -> d, x -> 0}, {y -> 0, x -> 0}}
其解都是关于a的方程的解
另外,这种形式还可以求解线性方程。
输入:Solve[{3 x + 4 y == 10, 2 x + 5 y == 9}, {x, y}]
输出:{{x -> 2, y -> 1}}
直接使用Solve[{3 x + 4 y == 10, 2 x + 5 y == 9}]也是可以的,因为这个时候未知量与方程个数相同,软件能够自行确定,指定变量名称主要是用于未知量超过了函数个数的情形:
输入:Solve[{a x + b y == c, d x + e y == f}, {x, y}]
输出:{{x -> -((c e - b f)/(b d - a e)), y -> -((-c d + a f)/(b d - a e))}}
Solve还可以求解非线方程(组),例如:
输入:Solve[x^3 - 2 x + 1 == 0]
输出:{{x -> 1}, {x -> 1/2 (-1 - Sqrt[5])}, {x -> 1/2 (-1 + Sqrt[5])}}
Solve也可以求解超越方程,但是只限于有限解,例如:
输入:Solve[Tan[x] == 1, x]
During evaluation of In[13]:= Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information. >>
输出:{{x -> \[Pi]/4}}
因为使用了反函数,所以值给出了一个值。
高级问题:
1.方程无解怎么处理?答案是:直接给出空列表,例如:
输入:Solve[x^2 - 1 == x^2, x]
输出:{}
2.复数根如何处理?
关于这个问题,先看看如下例子:
输入:Solve[x^4 - 4 x + 3 == 0, x]
输出:{{x -> 1}, {x -> 1}, {x -> -1 - I Sqrt[2]}, {x -> -1 + I Sqrt[2]}}
运行良好,符合代数基本定理。
如果只关心实根,而不需要复根呢?对于次数较低的方程,我们当然可以用眼睛看,可是多了之后就麻烦了,这个时候你需要使用Miscellaneous`RealOnly`软件包:
输入:<< Miscellaneous`RealOnly`
Solve[x^4 - 4 x + 3 == 0, x]
Nonreal::warning: Nonreal number encountered.
输出:{{x -> 1}, {x -> 1}, {x -> Nonreal}, {x -> Nonreal}}

说了这么多Solve的用法,再来看看NSolve的使用。
Solve使用的是传统的解析方法,而NSolve,顾名思义,就是数值求解了。该函数有两种用法:
1.NSolve[方程,变量]
2.NSolve[方程,变量,n],其中n为指定的精确度
看这个例子:
输入:f = x^7 - 6 x^6 + 2 x^5 + 2 x^4 - 3 x^3 + 2 x + 2 == 0;
输入:Solve[f, x]
输出:{{x -> 1}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 1]}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 2]}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 3]}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 4]}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 5]}, {x -> Root[-2 - 4 #1 - 4 #1^2 - #1^3 - 3 #1^4 - 5 #1^5 + #1^6 &, 6]}}
输入:NSolve[f, x]
输出:{{x -> -0.828685}, {x -> -0.425468 - 0.488614 I}, {x -> -0.425468 + 0.488614 I}, {x -> 0.542122\[VeryThinSpace]- 0.856535 I}, {x -> 0.542122\[VeryThinSpace]+ 0.856535 I}, {x -> 1.}, {x -> 5.59538}}
另外,需要注意的是,较低版本的Mathematica中NSolve只能提供最多16位有效数字,如果对于数字的有效位比较多,就应该使用N[Solve[方程,变量],n],这可以达到更多的有效位数,当然,在Mathematica 8中是不存在这个问题的。

  评论这张
 
阅读(4844)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016