- 积分
- 15
- 注册时间
- 2013-8-29
- 仿真币
-
- 最后登录
- 1970-1-1
|
最近发现 2014b solve 函数功能有所加强,比如:一些之前解不了的方程已经可以求解了,一些求不到符号解的方程会自动转向数值求解。
不过,比较显著的变化是:1. 对于解集含参变量的支持更好了, 2. 对于不等式(组)的求解有更好的支持了
1. 对于解集含参变量的支持更好了
这是通过新增的 ReturnConditions 参数调用实现的:
S = solve(eqns,vars,'ReturnConditions',true)
这一功能的引入,使得 solve 函数可以针对解集中含有参变量的情形做更好的处理,返回的 S 将是一个结构体 (当然也可以指定多个独立的返回变量),由三部分组成,分别是:x (求解变量)、parameters (参变量)、conditions(参变量满足的条件,即解存在的条件)。唯一需要做的是将这里的 ReturnConditions 设置为 true (默认是 false)。这一功能的引入,使得求解方程(组)的通解表达式变得方便很多。
这里以方程中含周期函数为例。一般,周期函数方程的解集需要以通解的形式给出,通解表达式中的参变量所满足的条件可以由ReturnConditions参数来指定返回。而在之前的版本里,要么干脆得不到通解而只能得到若干特解,要么得到一种十分不友好的通解表达式。下面分类示例:
首先 sin(x) = 1/2 为例,如果我们直接写下面的代码:
>> syms x
>> solve(tan(x)-1/2)
ans =
atan(1/2)
则无论是2014b 还是之前的版本都只能得到以上一个特解。在 2014b 之前,我们似乎除了上述求解方法,也没有其他快捷的方法 “直接求得” 通解表达式了。但 2014b 中却可以通过ReturnConditions 轻易得到通解了:
>> syms x
>> [x, p, c] = solve(tan(x)-1/2,'ReturnConditions',true)
x =
atan(1/2) + pi*k
p =
k
c =
in(k, 'integer')
可以看到,我们得到了通解表达式,而且通解表达式中参变量 k 满足的条件也一并返回到了。
再举一个例子:
>> syms x
>> solve(sin(x)^2 + 2*sin(x) - 1)
ans =
-asin(1 - 2^(1/2))
-asin(2^(1/2) + 1)
pi + asin(1 - 2^(1/2))
pi + asin(2^(1/2) + 1)
2014b 中得到的是以上4个特解。这段程序如果放在老一点的版本里,比如 2014a 或 2012b 里,会得到下列的结果:
ans =
Z_ intersect (Dom::ImageSet(pi + asin(2^(1/2) + 1) + 2*pi*k, k, Z_) union Dom::ImageSet(- asin(2^(1/2) + 1) + 2*pi*k, k, Z_) union Dom::ImageSet(pi + asin(- 2^(1/2) + 1) + 2*pi*k, k, Z_) union Dom::ImageSet(- asin(- 2^(1/2) + 1) + 2*pi*k, k, Z_))
这实际上是一个通解表达式,可是这个表达式多少看起来让人不舒服,恐怕一般人很不习惯读这样的表达式吧,而且,即使用了pretty指令,也得不到改观,依然很难读。那么为了得到更加 user-friendly 的solution,我们看看 2014b 给我们带来什么样的改变:
>> syms x
>> [x, p, c] = solve(sin(x)^2 + 2*sin(x) - 1,'ReturnConditions',true)
x =
2*pi*k - asin(1 - 2^(1/2))
2*pi*k - asin(2^(1/2) + 1)
pi + asin(1 - 2^(1/2)) + 2*pi*k
pi + asin(2^(1/2) + 1) + 2*pi*k
p =
k
c =
in(k, 'integer')
in(k, 'integer')
in(k, 'integer')
in(k, 'integer')
可以看到4个通解表达式中参变量 k 所满足的条件都一一给出了,而且通解表达式非常友好!
其实,这里我主要想说的是,ReturnConditions 最大的好处是,它把通解集中参变量满足的条件以表达式的形式返回给conditions参数了,利用 conditions 返回值,我们还可以做一系列后续计算。比如,我们根据这个 conditions 返回值,只需结合 subs、isAlaways 函数做一些极其简单的操作,便可以对特定的参变量值做判断,从而筛选出我们感兴趣的某些解,并且后续一系列计算变得很方便。而早期的版本的条件表达式并没有直接返回给我们,要做上述操作,我们还需要去手写这些表达式,这是极其不便利的。下面依然回到第一个例子说明:
- syms x
- [x, p, c] = solve(tan(x)-1/2,'ReturnConditions',true);
- k = 15;
- if isAlways(subs(c, p, k))
- x = subs(x,p,k)
- end
复制代码 x =
15*pi + atan(1/2)
显然,以上操作正是基于返回得到的条件表达式做了后续计算,而在早起版本里,这些都不是直接能做到的。
2. 对于求解不等式(组)的支持也更好了
例子 1:求 [-2*pi, 2*pi] 之间所有自然对数小于1.5的整数
>> syms x
>> assume(x,'integer')
>> solve(x<=2*pi,x>=-2*pi,log(x)<1.5)
ans =
1
2
3
4
而相同的程序在之前的版本中都会给出 Warning: 3 equations in 1 variables. 的警告,因为它把3个不等式看作3个方程了,而这里只有一个未知数 x。
需要说明的是,上面为了力求说明问题,例子都很简单。下面,有时间我再继续补充
|
评分
-
1
查看全部评分
-
|