我如何在while循环中用另一个变量的值替换变量的值

时间:2018-12-07 12:04:26

标签: java

如何在循环中用另一个变量的值替换变量的值?我正在尝试在一个循环中将变量heightn的值替换为变量fluidheight的值,heightn的基本值为20,但是一旦完成1个循环(最终计算出fluidheight),它将立即更改heightn的值与fluidheight的值。我试过进行heightn = fluidheight,反之亦然,并将代码行放置在多个位置,但仍然无法正常工作。在多次循环后,始终假定heightn为20。有任何提示或建议吗?

    double heightn = 20;
    double g = 0;
    double sqt = heightn/2;
    double areaofnozzle = 0.0218209;
    double time = 0;
    double velocity;
    double volumelost;
    double totalvolume = 1005.309;
    double fluidheight = heightn;
    int x = 0;

    while (x < 2)
    {
        while (sqt!= g)
    {

        g=sqt;

        sqt = (heightn/g+g)/2;


    }
    time = time + 60;

    velocity = 8.02 * sqt;

    volumelost = (velocity * areaofnozzle) * time;

    fluidheight = (totalvolume - volumelost)/ 50.265;

    x = x + 1;
    System.out.println("Volume Lost = "+ volumelost);
    //System.out.println("Fluid Height = "+ fluidheight);
    System.out.println("Time = "+ time);
    System.out.println("Squre Root = "+ sqt);
    System.out.println(" ");
    System.out.println("HeightN = "+ heightn);

    heightn = fluidheight;
    }

3 个答案:

答案 0 :(得分:0)

我有一些建议:

  1. 格式和可读性非常重要。学习Java编码标准,并更加注意花括号的位置,一致的缩进等。难以阅读的代码很难理解。
  2. 看起来您在这里进行了一些简单的流体计算,但是很难为变量命名。多考虑一些更好的名字。
  3. 使用相等比较双打是危险的。最好使用差值和公差的绝对值。浮点数不正确。

我已经弄清楚了,当您从油箱底部的喷嘴中排出油时,您正在尝试计算油箱中液体的高度与时间的关系。

您从质量守恒推导方程:

Rate of change of mass stored = Rate of mass in - Rate of mass out

存储的质量变化率等于储罐面积(向下看)乘以每单位时间液体高度的变化率。我不限制水箱的面积或周长的形状,但我假设是直边:横截面面积不会随高度而变化。

质量比率为零。

质量流出率是通过喷嘴流出的质量。它是从伯努利方程导出的。

这是一阶常微分方程。您正在使用最简单的集成方案:具有固定时间步长的显式Euler集成。

这是我的解决方法:

import java.util.Map;
import java.util.TreeMap;

/**
 * Euler integration of first order ODE for emptying a tank through a nozzle.
 * User: mduffy
 * Date: 12/7/18
 * Time: 7:54 AM
 * @link https://stackoverflow.com/questions/53669186/how-can-i-replace-the-value-of-a-variable-with-a-value-from-another-variable-in/53669375?noredirect=1#comment94196737_53669375
 */
public class Hydraulics {

    private static final double AREA_TANK = 1005.39/20.0;
    private static final double AREA_NOZZLE = 0.0218209;
    private static final double MASS_RATE_CONSTANT = 8.02;


    public static void main(String[] args) {
        double height = 20.0;
        int time = 0;
        int dt = 60;
        double tolerance = 1.0e-1;
        Map<Integer, Double> results = new TreeMap<>();
        while (height > tolerance) {
            results.put(time, height);
            height += derivative(time, height)*dt;
            time += dt;
        }
        System.out.println("Time  Height");
        for (int t : results.keySet()) {
            System.out.println(String.format("%5d %10.3f", t, results.get(t)));
        }
    }

    private static double derivative(int time, double height) {
        return -MASS_RATE_CONSTANT*AREA_NOZZLE*Math.sqrt(height)/AREA_TANK;
    }
}

这是我的结果。如果时间步长(以秒为单位),则大约需要39分钟才能耗尽我的游泳池:

Time  Height
    0     20.000
   60     19.066
  120     18.154
  180     17.264
  240     16.396
  300     15.550
  360     14.726
  420     13.925
  480     13.145
  540     12.388
  600     11.653
  660     10.940
  720     10.249
  780      9.580
  840      8.934
  900      8.309
  960      7.707
 1020      7.127
 1080      6.570
 1140      6.034
 1200      5.521
 1260      5.031
 1320      4.562
 1380      4.116
 1440      3.692
 1500      3.291
 1560      2.912
 1620      2.555
 1680      2.221
 1740      1.910
 1800      1.621
 1860      1.356
 1920      1.112
 1980      0.892
 2040      0.695
 2100      0.521
 2160      0.370
 2220      0.243
 2280      0.140
 2340      0.062

在任何时间步长上损失的体积等于高度变化乘以储罐面积,即AREA_TANK = 1005.39/20.0

在第一步中,音量变化为(19.066-20)* 1005.39 / 20 = -46.9517。到最后一个时间步降到(0.062-0.140)* 1005.39 / 20 = -3.9210。该速度变慢是因为随着池中液体高度的下降,喷嘴出口处的静压力下降。

想知道高度的平方根来自哪里?提示:喷嘴的伯努利方程式表示,出口速度与喷嘴处静压力的平方根成正比,而平方根与罐中剩余水的高度成正比。

答案 1 :(得分:0)

  

如何在循环中用另一个变量的值替换变量的值?

要将变量A的值替换为另一个变量B的值,请执行以下操作:

A = B; // After the execution of this line, the value of B will be assigned to A

是否处于循环中并不重要,它不会改变任何内容。

  

我正试图在循环中将变量heightn的值替换为变量fluidheight的值

在您的情况下,看起来像这样:

heightn = fluidheight; // The value of fluidheight will be assigned to heightn

我认为您对第一次迭代的困惑可能是因为您在更改之前显示了heightn 的值。因此,在第一次执行之后,您将始终在标准输出中看到当前heightn的值为20

  • 在第一次执行循环时,您将看到20
  • 在循环的第二次执行中,您将看到第一次执行的结果。
  • 从不显示第二次执行的(最终)结果。

我建议您更改以下部分:

heightn = fluidheight;
System.out.println("Volume Lost = " + volumelost);
System.out.println("Time = " + time);
System.out.println("Squre Root = " + sqt);
System.out.println(" ");
System.out.println("HeightN = " + heightn);

最后,就像@David在评论中说的那样,这是典型的情况,您应该利用调试器。

答案 2 :(得分:0)

在循环的最后一行中分配heightn的值。但是在分配新值之前,此变量的输出值。添加

System.out.println("HeightN = "+ heightn); 

之后循环,您将在循环计算后看到变量值,或者简单地交换最后两行代码(println和赋值)