1

我有以下等式:

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

如何在不使用循环的情况下更准确地解决它?

4

6 回答 6

3

如果你有

N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))

那你就知道了

(1+lam)^3 = N*(1-lam)*(1+lam^2)

假设您要扩展这些术语?合并成一个简单的三次方程,实系数为零?有什么功能可以为您解决吗?

答案是肯定的。一种解决方案可能是使用 fzero,但由于方程只是三次多项式,因此除非您需要符号解,否则根就是答案。使用符号工具箱解决符号问题。

于 2010-09-07T11:04:04.713 回答
2

这是 Wolfram Alpha 的 N=10 的解决方案:

http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10

代数解决方案将适用于您的特定情况,因为它并不是非常困难。问题是,一般来说,非线性方程需要一个迭代解:从猜测开始,朝特定方向迈进,并希望收敛到一个解。如果没有迭代和循环,您通常无法求解非线性方程。

于 2010-09-07T11:37:01.483 回答
1

将方程重新排列为0 = f(x)/g(x)(其中fg是多项式)。然后求解0 = f(x)。这应该很容易,就像f立方一样(http://en.wikipedia.org/wiki/Cubic_function#Roots_of_a_cubic_function)。事实上,Matlab 有roots()这样做的功能。

于 2010-09-07T10:45:16.050 回答
1

绘图表明,对于 N 正数,在区间 [-1,1) 中恰好有一个解。您应该考虑牛顿法,它会很快收敛为零初始猜测。

于 2010-09-07T11:44:28.377 回答
1

正如其他答案中所讨论的那样,您可以以封闭形式求解此方程,但老实说,次数 > 2 的多项式的封闭形式解在实践中并不是很有用,因为结果往往条件不佳。

对于您的特定多项式,我同意亚历山大的观点,牛顿的方法可能是要走的路。

不过,从长远来看,我强烈建议编写(或从 Internet 重用)Jenkins-Traub 寻根算法的实现。维基百科将其描述为“实际上是黑盒多项式求根器的标准”,他们并没有夸大其词。多年来,它满足了我所有的多项式求解需求;以我的经验,它比牛顿法(不依赖于良好的初始猜测)和基于特征值的方法更健壮,并且启动速度非常快。

于 2010-09-08T19:42:06.350 回答
0

对于大多数 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 所指出的,用数值方法解决问题需要迭代(所以它很慢),并且求解器可能会陷入局部最小值。

于 2010-09-08T17:15:22.737 回答