Я попросил Chat GPT создать физическую симуляцию группы молекул гелия, перемещающихся в контейнере и выдающих среднюю температуру с течением времени.

Я буду честен, как ни удивительно, как ChatGPT отлично справляется с тем, что его просили сделать, по крайней мере, с точки зрения кода, это намного веселее, потому что я чувствую, что я своего рода ученый (хотя и кабинетный). ), который исследует глубины и границы постоянно расширяющегося искусственного интеллекта. Я планирую публиковать эти статьи еженедельно, но я чувствую, что мощь ChatGPT потенциально может увеличиваться даже сверхлинейно, если не экспоненциально, от недели к неделе. К концу года, держу пари, он сделает мою стирку!

Процесс

Процесс занял несколько итераций, но, похоже, он сработал. Первая подсказка, которую я использовал, была:

создайте физическую симуляцию контейнера, наполненного молекулами газа, с помощью java-скрипта. Молекулы должны быть простыми двухатомными молекулами газообразного гелия. Также в дополнение к физике столкновений также добавьте поправки на силы Ван-дер-Вальса и примените искажение к механике молекул на основе этих сил

На какой чат GPT ответил:

Хотя это было очень информативно, в конечном итоге это не дало того, что я просил. Итак, демонстрируя чудесную силу А.И. чтобы адаптироваться к повторяющимся ответам, я спросил его:

  • создайте простую 2D-демонстрацию всего вышеперечисленного в java-скрипте до уровня сложности, который вы можете запрограммировать

Наконец-то он начал что-то выводить! Но я хотел еще несколько вещей, чтобы я мог назвать это правильным началом физической симуляции:

  • используя массу ядра гелия и скорости молекул газа, есть метка, которая выводит температуру ящика в любой момент. Используйте статистическую механику для расчета температуры

И наконец:

  • обновите приведенный выше код, чтобы добавить метку в формате html под контейнером с газом. Справа от контейнера с газом есть небольшая рамка, которая объясняет кинетическую теорию газов, а под ней находится соответствующее уравнение

Окончательный код после нескольких исправлений ChatGPT и объединения всех его выводов:

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.min.js"></script>
  <style>
    body {
      margin: 0;
    }
    #temperature {
      position: absolute;
      bottom: 0;
    }
    #theory {
      position: absolute;
      right: 0;
      padding: 10px;
      background-color: #f2f2f2;
    }
  </style>
</head>
<body>
  <script>
    let container;
    let molecules = [];
    let vdwConstant = 1;
    let vdwRadius = 50;
    let temperature;
    let k = 1.38e-23;

    function setup() {
      createCanvas(600, 600);
      container = new Container(width / 2, height / 2, width / 2 - 50, height / 2 - 50);
      for (let i = 0; i < 100; i++) {
        molecules.push(new Molecule(random(width), random(height), random(-2, 2), random(-2, 2)));
      }
    }

    function draw() {
      background(255);
      container.display();
      updateTemperature();
      for (let i = 0; i < molecules.length; i++) {
        let m1 = molecules[i];
        m1.collide(container);
        m1.update();
        m1.display();
        for (let j = i + 1; j < molecules.length; j++) {
          let m2 = molecules[j];
          let distance = dist(m1.x, m1.y, m2.x, m2.y);
          if (distance < vdwRadius) {
            let force = vdwConstant / (distance * distance);
            let angle = atan2(m2.y - m1.y, m2.x - m1.x);
            m1.applyForce(force, angle);
            m2.applyForce(force, angle + PI);
          }
        }
      }
    }
    function updateTemperature(){
      let kineticEnergy = 0;
      for (let i = 0; i < molecules.length; i++) {
        let m = molecules[i];
        kineticEnergy += 0.5 * m.mass * (m.vx * m.vx + m.vy * m.vy); 
      }
      temperature = 2 * kineticEnergy / (molecules.length * k);
      console.log("Temperature: " + temperature);
      document.getElementById("temperature").innerHTML = "Temperature: " + temperature;
    }
  </script>
  <div id="temperature"></div>
  <div id="theory">
    <p>Kinetic theory of gases:</p>
    <p>The average kinetic energy of a gas molecule is directly proportional to the temperature of the gas.</p>
    <p>T = 2 * kineticEnergy / (N * k)</p>
  </div>
</body>

<script>

class Container {
  constructor(x, y, w, h) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
  }

  display() {
    stroke(0);
    noFill();
    rectMode(CENTER);
    rect(this.x, this.y, this.w * 2, this.h * 2);
  }
}

class Molecule {
  constructor(x, y, vx, vy) {
    this.x = x;
    this.y = y;
    this.vx = vx;
    this.vy = vy;
    this.mass = 4;
    this.radius = 2;
  }

  display() {
    stroke(0);
    fill(0);
    ellipse(this.x, this.y, this.radius * 2, this.radius * 2);
  }

  update() {
    this.x += this.vx;
    this.y += this.vy;
  }

  collide(container) {
    if (this.x + this.radius > container.x + container.w) {
      this.vx *= -1;
      this.x = container.x + container.w - this.radius;
    } else if (this.x - this.radius < container.x - container.w) {
      this.vx *= -1;
      this.x = container.x - container.w + this.radius;
    }
    if (this.y + this.radius > container.y + container.h) {
      this.vy *= -1;
      this.y = container.y + container.h - this.radius;
    } else if (this.y - this.radius < container.y - container.h) {
      this.vy *= -1;
      this.y = container.y - container.h + this.radius;
    }
  }

  applyForce(force, angle) {
    this.vx += force * cos(angle) / this.mass;
    this.vy += force * sin(angle) / this.mass;
  }
}

</script>

</html>

И видео конечного результата. Довольно удивительно! Я не могу дождаться, чтобы увидеть, какие более сложные симуляции я смогу создать с помощью этого после некоторых уговоров!