获取在满足条件之前的迭代总数

本文关键字:迭代 满足 条件 获取 | 更新日期: 2023-09-27 18:16:32

for (int i= 0; i<10; i++)
{
    phi0 = phi0 * (L / L0);
    X0 = R * Math.Sin(2 * phi0) * Math.Cos(phi0);
    L0 = X0 * (1 + (Math.Pow(Math.Tan(phi0), 2)) / 10 - (Math.Pow(Math.Tan(phi0), 4)) / 72 + (Math.Pow(Math.Tan(phi0), 6)) / 208);
    if ((Math.Abs(L0 - L)) < (0.003 * Math.Sqrt(L)))
        break;
}

通常在2,3次迭代后条件得到满足,但我需要一条消息来显示满足条件的迭代次数,以及是否超过10的总次数。

如果有什么需要解释的,尽管问。

谢谢!

获取在满足条件之前的迭代总数

i的声明移出循环,使其后面可用。

可以在循环结束后检查它的值。如果是<10,则通过退出条件退出循环。如果恰好是10,则最后一次允许的迭代(i==9)不满足退出条件。

i的声明移出循环,然后可以使用它的值。请记住,i的值将比使用的迭代次数少1,因为您从0开始——实际上,由于您在循环中的任何表达式中都没有使用i,因此您可能希望它从1到10,而不是从0到9。

注意,你也可以做一个小的优化,使事情更快。编译器可能会为您做这件事,但您可以通过将tan(phi0)的中间计算存储在一个局部变量中来确保这一点。

int i = 1;
for (; i<=10; i++)
{
    phi0 = phi0 * (L / L0);
    var tanPhi0 = Math.Tan(phi0);
    X0 = R * Math.Sin(2 * phi0) * Math.Cos(phi0);
    L0 = X0 * (1 + (Math.Pow(tanPhi0, 2)) / 10 - (Math.Pow(tanPhi0, 4)) / 72 + (Math.Pow(tanPhi0, 6)) / 208);
    if ((Math.Abs(L0 - L)) < (0.003 * Math.Sqrt(L)))
        break;
}
if (i <= 10)
{
    Console.WriteLine( "The loop took {0} iterations", i );
}
else
{
    Console.WriteLine( "It did not converge" );
}

实际上,如果执行了很多次,您可能想要进一步执行它,并尝试分阶段计算tan(phi0)的幂,而不是每次调用Pow。我在这里假设乘法比调用Pow方法要快,这似乎是合理的,但您需要进行测试以确保这一点。也没有理由每次都计算错误边界。

var epsilon = 0.003 * Math.Sqrt(L);
int i = 1;
for (; i<=10; i++)
{
    phi0 = phi0 * (L / L0);
    var tanPhi0 = Math.Tan(phi0);
    var tanPhi0_2 = tanPhi0 * tanPhi0;
    var tanPhi0_4 = tanPhi0_2 * tanPhi0_2;
    var tanPhi0_6 = tanPhi0_4 * tanPhi0_2;
    X0 = R * Math.Sin(2 * phi0) * Math.Cos(phi0);
    L0 = X0 * (1 + tanPhi0_2 / 10 - tanPhi0_4 / 72 + tanPhi0_6 / 208);
    if ((Math.Abs(L0 - L)) < epsilon)
        break;
}
if (i <= 10)
{
    Console.WriteLine( "The loop took {0} iterations", i );
}
else
{
    Console.WriteLine( "It did not converge" );
}

声明i在循环之外(之前),然后你可以在之后使用它。

只需添加一个简单的计数器:

int iterCount = 0;
for (int i= 0; i<10; i++)
{
    iterCount++;
    ϕ0 = ϕ0 * (L / L0);
    X0 = R * Math.Sin(2 * ϕ0) * Math.Cos(ϕ0);
    L0 = X0 * (1 + (Math.Pow(Math.Tan(ϕ0), 2)) / 10 - (Math.Pow(Math.Tan(ϕ0), 4)) / 72 + (Math.Pow(Math.Tan(ϕ0), 6)) / 208);
    if ((Math.Abs(L0 - L)) < (0.003 * Math.Sqrt(L)))
        break;
}
MessageBox.Show("Number of iterations: " + iterCount);

在循环前声明一个布尔变量(bool done = false),如果满足条件则将其设置为true。在中断之前,打印i的值以获得迭代次数。

 if ((Math.Abs(L0 - L)) < (0.003 * Math.Sqrt(L))) {
       done = true;
       Console.WriteLine(i);
       break;
 }

如果done == false在循环之后,则表示循环中不满足条件。

你基本上只需要扩展变量i的作用域,对吧?可以这样做:

int i;
for (i = 0; i<10; i++)
{
  //Do stuff
}
Console.WriteLine("i: " + i);

变量i仍然在循环外的作用域中,并保持循环中断时它的值;如果没有破裂,则为10。