如何在循环中用另一个变量的值替换变量的值?我正在尝试在一个循环中将变量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;
}
答案 0 :(得分:0)
我有一些建议:
我已经弄清楚了,当您从油箱底部的喷嘴中排出油时,您正在尝试计算油箱中液体的高度与时间的关系。
您从质量守恒推导方程:
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和赋值)