java - 如何循环和存储物理方程中的值

标签 java loops for-loop physics

所以我想在这些步骤中计算这些方程

  1. q1*q3*k/(r^2)= F1_3(this is the electric force between 1 and 3)

  2. q2*q3*k/r^2)= F1_2(force between particle 1 and 2)

  3. from there i can find the net force between the two charges with f1_3+f1_2=fnet

  4. with the net force i would then find the acceleration using a=fnet/m (with m being the mass. (now everything above i was okay with doing but now heres where i get confused)

  5. take the acceleration just found and find velocity. v=-(at) being time intervals (i got that equation aver deriving it from the equation in step 6 and the initial equation was x(.05)=at+v

  6. take that velocity and previous acceleration and find new position: x=1/2at^2+v*t+x

  7. the value for x becomes the new position for particle 3 and now i go back to to the top in order to calculate electric force then acceleration etc rinse and repeat.

这些步骤是我现在想一遍又一遍重复的,我希望它是 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;
}        
}

最佳答案

是的,这对于物理模拟来说很常见。通常,您定义如何进行一个时间步长,然后循环执行整个时间。对于涉及粒子的模拟,通常需要存储位置和速度来计算运动。

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

请注意,速度位置vectors .

关于java - 如何循环和存储物理方程中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39693539/

相关文章:

c - C 中的行很奇怪

java - Java泛型可以替代多个相似的类吗?

java - 发布前优化Android应用

java - 循环播放音频Android Studio

C - 更改 strtok 以合并 strcmp 后无输出打印

java - 什么时候调用静态循环?

java - 无法通过vim运行java

Java开发: Nested Array Equivalent to This XML

javascript - while 循环中从日期到日期的计数

php - 如何在循环中创建循环...? PHP-MySQLi