所以我想在这些步骤中做这些方程式
q1 * q3 * k /(r ^ 2)= F1_3(这是1到3之间的电力)
q2 * q3 * k / r ^ 2)= F1_2(粒子1和2之间的力)
从那里我可以找到两个电荷之间的净力f1_3 + f1_2 = fnet
用净力我会用a = fnet / m找到加速度(m是质量。(现在我上面的所有东西都可以,但现在我感到很困惑)
取刚刚找到的加速度并找到速度。 v = - (at)是时间间隔(我得到了这个等式,从步骤6中的等式得出它,初始等式是x(.05)= at + v
获取该速度和之前的加速度并找到新位置:x = 1 / 2at ^ 2 + v * t + x
- 醇>
x的值成为粒子3的新位置,现在我回到顶部以计算电力然后加速等冲洗并重复。
这些步骤是我想一遍又一遍地重复我的间隔我希望它是1微秒或10e-6所以从0.0-1.0微秒0.0-2.0微秒我希望它存储在每个位置间隔。事情是它必须使用我在前几个步骤中列出的方程再次计算力的值,然后返回找到位置。我不知道是否应该使用“for”循环它,但我不知道如何真正去做。我有扫描仪方法在最后因为我完成了代码我希望能够输入电荷的位置和它们的大小,然后它将使用方程式,但一次一步。
我想做的不可能吗?
import java.util.Scanner;
import javax.swing.JFrame;
public class Firstgui {
private static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
//declare variables
double postionq1= 0.0; // position of q1 is at origin i just put it here for reference
double distanceq3_q1=.01; //q3 is placed between q1 and q2
double distanceq3_q2= .014-distanceq3_q1; //distance from q3 to q2
double q1=5e-6;
double q2=-4e-6;
double q3=-2e-6;
double mq1=3e-5;
double k= 8.99e9;
double F1_3 = Force(q1, q3, k, distanceq3_q1);
double F2_3= -Force(q2, q3, k, distanceq3_q2);
double Fnet=F1_3+F2_3;
System.out.println(F1_3);
System.out.println(F2_3);
System.out.println(Fnet);
System.out.println("particle 3 position from 0.0-1micro-seconds is " + position(acceleration(Fnet,mq1), 0.000001 , velocity( 0.000001 , acceleration(Fnet,mq1)),.01));
// this print line above is the final the position of q3 a 1 microsecond
//now with that value that it prints how would i use that for the next
//position of q3 and recalculate the fnet then acceleration etc.
}
public static double Force(double q1, double q2, double k, double r) {
double electricforce=(q1*q2*k)/(Math.pow(r, 2));
return electricforce;
}
public static double acceleration(double f, double m) {
double acell=f/m;
return acell;
}
public static double position(double a, double t, double v, double x ) {
double postion=.5*a*(t*t)+(v*t)+x; // a- acceleration through out out this time interval is constant
return postion;
}
public static double velocity(double t, double a) {
double v=-(t*a); // a- acceleration through out out this time interval is constant
return v;
}
}
答案 0 :(得分:1)
是的,物理模拟很常见。通常,您可以定义一个时间步长的方式,然后循环遍历所有时间。对于涉及粒子的模拟,通常需要存储位置和速度来计算运动。
public static void main(String[] args) {
int nbrSteps = 1000;
// Store the data
PointArray points = // The data would look like this. Particle at index 0 corresponds with the data {x0, y0, z0}
0: {x0, y0, z0},
1: {x1, y1, z1},
...
VelocityArray velocities = // And here, very similarly
0: {vx0, vy0, vz0},
1: {vx1, vy1, vz1},
...
for (int i = 0; i < nbrSteps; i++) {
takeStep(points, velocities);
// You probably want to record the simulation somehow. Either you save your
// data to disk, or you render it on the screen. Both calls could be put here.
}
}
public static void takeStep(PointArray points, VelocityArray velocities) {
for (int i = 0; i < points.length(); i++) {
const double timestep = 1e-6;
// Here you implement the steps you described, and update position and velocity accordingly
velocities[i] = ...
points[i] = ...
}
}
编辑:作为一个例子,我们可以模拟重力。我们可以通过此
更改takeStep
public static void takeStep(PointArray points, VelocityArray velocities) {
for (int i = 0; i < points.length(); i++) {
const double timestep = 1e-6;
// Doing something simple, lets simulate gravity
const double gravity = -9.82;
velocities[i].y += f_gravity*timestep;
points[i] = velocity[i]*timestep;
}
}
对于你的情况,你需要计算每个粒子的力(当重力值已经知道时我们不需要),然后应用它与我用线性积分的方式类似。这意味着
velocity = force*change_in_time
position = velocity*change_in_time
请注意,force
,velocity
和position
为vectors。