获取在满足条件之前的迭代总数
本文关键字:迭代 满足 条件 获取 | 更新日期: 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。