Matlb fsolve
使用fsolve时通过Maple(是目前世界上最为通用的数学和工程计算软件之一)使用数值逼近技术找到方程或方程组的一个的近似解。
fsolve语法是标准的Maple语法: fsolve(what,how);
其中,\”代表要解的方程(或方程组)”how”是指要求的变量。 要阅读关于解决方程的设置的详细信息,请参阅求解命令的说明。
使用fsolve解一个方程:fsolve由于采用数值模拟技术,而不是代数的,它要求方程数目与要求的变量数目相同。因此,当fsolving一个方程,方程只有一个不确定的变量是至关重要的。
有两种方法可以使用fsolve命令。第一个就像solve命令: > restart;
> fsolve(x^2+5*x=17,x);
-7.321825380, 2.321825380
上述示例表明fsolve,就像solve,知道多项式有多少期望的根,并试图找到他们(即使是复杂的)。当解一个超越方程时,fsolve通常是找到一个符合要求的解。
当一个方程有许多解,你要挑选出一个具体的时,fsolve的第二种使用方法特别重要。在这个版本的fsolve中,可以指定一个能得到解的域(区间)。例如,考虑方程
> eqn:=x=tan(x); eqn : = x=tan( x )
从plotting两侧,我们可以看到这个公式有很多解:
> plot({x,tan(x)},x=-8..8,-8..8,discont=true,thickness=2,color =black);
只使用fsolve这个方程将找到一个解: > fsolve(eqn,x); 0.
现在,假设我们想找到6和8之间解。然后我们输入 > fsolve(eqn,x,x=6..8);
7.725251837 > tan(%); 7.725251841
因此我们得到的解大约在7周围
什么会导致错误?除了语法错误,也有几件事情将导致使用fsolve时出问题。首先,与solve一样,要解的方程“变量”已经赋值就是可能的一种(也许,这就是一个在Maple会话期间遗忘)。这将导致在以下反应:
> x:=3: fsolve(x^2=4,x);
Error, (in fsolve) invalid arguments
其他的可能导致出错的事情涉及Maple的似乎无法找到一个解。这可能由以下两种情况之一导致:第一,有可能是无解 - 第二,Maple使用的数值方法可能需要用户的小援助。例如:
> x:='x':fsolve(sin(x)=exp(x^2),x);
fsolve
这种“无响应”表示Maple找不到一个解。但这是因为这个方程有没有解。有时,fsolve选择的最初的逼近不佳,导致随后无法找到一个解即使解存在。Maple在这种情况下返回一个消息,并建议选择“不同”开始间隔。在这种情况下,使用fsolve与指定域的第二个版本会解决这个问题。(当然,找到合适的域,最合理的要做的就是绘制方程双方的交汇点,并估计!)。
最后,如果方程数目和未知数数目不同,fsolve将返回一个错误消息: > fsolve(a*x=1,x);
Error, (in fsolve) a is in the equation, and is not solved for 当然,solve命令能够轻松地处理这个方程 > solve(a*x=1,x);
使用fsolve来解方程组:要与\”,“how”的语法一致,fsolve要求方程组和求解的变量列表被括在大括号{}里。例如:
> fsolve({2*x+y=17,x^2-y^2=20},{x,y}); {x =16.37758198, y =-15.75516397 } 重要的是要记住,方程的数量必须和未知数的数目相同,并没有其他未指明的变量在方程组里:
> fsolve({a*x+y=13,b*x-y=20},{x,y});
Error, (in fsolve) {a, b} are in the equation, and are not solved for
最后,我们注意到给fsolve一个搜索域是可能的(通常是最好的),- 这是通过给每个变量提供了一个长方形的盒状区域把他们分开间隔,从而fsolve在这个域中找到一个解。例如,让我们考虑解决上述方程组:
> eqn1:=2*x+y=17: eqn2:=x^2-y^2=20: 我们给方程的名称,主要是为了提醒你这是可能的。试验几个plot结果如下,这表明,上述“fsolve”语句只返回了两个交点中的一个:
我们可以像下面一样强制fsolve找到最左边的一个交点: > fsolve({eqn1,eqn2},{x,y},{x=4..8,y=0..10}); {y = 4.421830634, x = 6.289084683 }
这里的语法很重要!首先是要解的方程组(大括号括起来),然后是要求解的一组变量(大括号括起来),最后是变量范围(大括号括起来)清单。当解方程组时只有第三个选项(变量范围)是可选的。其他两个必须选择。
solve和fsolve照常,我们可以代入解到方程,以验证解是正确的。首先,我们给它一个名字:
> s:=%;
s :={ y = 4.421830634, x = 6.289084683 } > subs(s,eqn1),subs(s,eqn2);
17.00000000 = 17, 19.99999999 = 20 因此,它似乎起作用了。
很快我们就注意到最后输出的:19.99999999显然不是20,但它是Maple在这种情况下所能接近的。根据计算机/计算器的设计,所有计算机和计算器做算术运算时,一个数字的数量有限,因此,需要更多的数字值被四舍五入或略去。不精确的数字计算,导致不精确的结果,且较长的问题,涉及许多次计算,这可能会导致计算机/计算器产生的结果甚至没有接近正确的答案。
最后注意到 - 当你给变量的区间时,必须给出所有的变量范围。如果只指定某些而非所有的变量的区间,fsolve将不返回任何东西。
相关推荐: