首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单迭代

简单迭代
EN

Stack Overflow用户
提问于 2022-07-12 13:28:10
回答 1查看 134关注 0票数 0

你能帮我用简单的迭代法吗?我写了一个算法,但由于某种原因,它趋于无穷大,牛顿算法没有问题地解决了这个任务,但是这个算法有一个问题。你能告诉我该怎么做才能使它充分发挥作用吗?

x^3+3*x^2-2=0

代码语言:javascript
运行
复制
 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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的示例代码,展示了这个想法。

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72953121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档