我有以下等式:

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) (在哪里 fg 是多项式)。然后解决 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所指出的那样,用数值方法解决问题需要迭代(因此它很慢),并且求解器可能会卡在局部最小值中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top