你能帮我用简单的迭代法吗?我写了一个算法,但由于某种原因,它趋于无穷大,牛顿算法没有问题地解决了这个任务,但是这个算法有一个问题。你能告诉我该怎么做才能使它充分发挥作用吗?
x^3+3*x^2-2=0
static void Main(string[] args)
{
Console.WriteLine(Solve(-3.0));
}
static double function(double x) => Math.Pow(x, 3) + 3 * Math.Pow(x, 2) - 2;
static double Solve(double x)
{
double eps = 0.000001;
double y;
double b;
do
{
y = function(x);
b = Math.Abs(y - x);
x = y;
}while (b >= eps);
return y;
}
发布于 2022-07-12 15:21:07
你有两个问题。
第一种是不动点方法解决了形式f(x) = x
而不是f(x) = 0
的问题。
您可以通过尝试解决x = x^3+3*x^2-x-2
来解决这个问题,但随后您会遇到第二个问题。也就是说,除非你猜得离答案很近,否则x^3
会在每一次迭代中增长,然后你就会走向无穷大。
因此,您需要找到表单f(x) = x
的一个问题来解决f
趋向于收敛的问题,而不是发散。
我建议您将其重写为x^3 = -3*x^2 + 2
,然后取立方体根,因此您现在正在求解x = (-3 x^2 + 2)^(1/3)
。C#可能不喜欢负数的小数幂,所以您需要检查这个符号并在知道(-y)^(1/3) = -y^(1/3)
的情况下手动处理。
下面是Python中的示例代码,展示了这个想法。
def iteration (x):
y = -3 * x*x + 2
if y < 0:
return - (-y)**(1/3)
elif 0 < y:
return y**(1/3)
else:
return 0
x = 100
for i in range(100):
print(i, x)
x = iteration(x)
https://stackoverflow.com/questions/72953121
复制相似问题