题
我有以下等式:
f(N): N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));
我需要创建一个找到的函数 lam
指定 N
.
现在,我正在使用简单循环进行操作:
lam = 0.9999;
n = f(lam);
pow = 0;
delta = 0.1;
while(abs(N - n)) > 0.1 & pow < 10000)
lam = lam - 0.001;
n = f(lam)
pow = pow+1;
end
如何在不使用循环的情况下更准确地解决它?
解决方案
如果你有
N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))
那你知道
(1+lam)^3 = N*(1-lam)*(1+lam^2)
假设您要扩展这些条款?合并为一个具有实际系数的简单立方方程,等于零?是否有可以为您解决的函数?
答案是肯定的。一种解决方案可能是使用fzero,但是由于方程只是一个立方多项式,因此除非您需要符号解决方案,否则根源是答案。使用符号工具箱解决符号问题。
其他提示
这是Wolfram Alpha的n = 10解决方案:
http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10
代数解决方案将适用于您的特定情况,因为这并不难。问题在于,通常,非线性方程需要迭代解决方案:从猜测,朝特定方向迈进,并希望收敛到解决方案。您一般无法求解非线性方程 没有 迭代和循环。
重新排列方程为 0 = f(x)/g(x)
(在哪里 f
和 g
是多项式)。然后解决 0 = f(x)
. 。这应该很容易 f
将是立方体(http://en.wikipedia.org/wiki/cubic_function#roots_of_a_cubic_function)。实际上,Matlab有 roots()
功能来执行此操作。
绘制表明,对于n个阳性,在间隔[-1,1)中恰好有一个解决方案。您应该考虑 牛顿的方法, ,它将很快收敛于零初始猜测。
如其他答案中所述,您可以以封闭形式求解该方程式,但是说实话,对多项式> 2的多项式解决方案在实践中不是很有用,因为结果往往条件不佳。
对于您的特定多项式,我同意Alexandre的观点,即牛顿的方法可能是必经之路。
但是,从长远来看,我强烈建议写(或从互联网重复使用)jenkins-traub根找到算法的实现。 Wikipedia将其描述为“实际上是黑盒多项式根界面的标准”,它们并不夸张。多年来,它已经满足了我所有的多项式解决需求。根据我的经验,它比牛顿的方法更强大(不依赖良好的初始猜测)和基于特征值的方法,并且很快就可以启动。
对于大多数n值,您的问题都有一个代数解决方案。这是解决方案,如该解决方案。 Wolfram Alpha:
if N+1!=0
x = (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3)/(3 2^(1/3) (N+1))-(2^(1/3) (2 N^2+3 N))/(3 (N+1) (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3))+N/(3 (N+1))
是的,这很丑。
如果您有一个,那么确切的代数解决方案,即使是这样的大丑陋解决方案,总是比数值解决方案优越。正如Duffymo所指出的那样,用数值方法解决问题需要迭代(因此它很慢),并且求解器可能会卡在局部最小值中。