Code tính toán mật độ phân bố điện trường năm 2024

Được viết dành cho người mới học, cuốn sách này giới thiệu lập trình MATLAB và mô phỏng các hệ thống vật lý. Cuốn sách mở đầu với các giá trị vô hướng và dần dần nâng lên véc-tơ và ma trận. Các chủ đề được trình bày bao gồm biến và giá trị, đoạn mã lệnh, vòng lặp, phương trình vi phân thường, véc-tơ và hàm. MATLAB được dùng trọn vẹn trong cuốn này để giải quyết nhiều bài tập cuối chương. [trích thông tin từ Amazon.com]

Tác giả

Allen B. Downey là Phó giáo sư ngành Khoa học máy tính tại Franklin W. Olin College of Engineering. Ông đã viết một số cuốn sách, bao gồm Computational Modeling and Complexity Science, How to Think Like a Computer Scientist [Cách tư duy như nhà khoa học máy tính], The Little Book of Semaphores, Physical Modeling in MATLAB, và Learning Perl the Hard Way.

Mục lục

Chương 1: Các biến và giá trị Chương 2: Mã lệnh chương trình Chương 3: Vòng lặp Chương 4: Véc-tơ Chương 5: Hàm Chương 6: Tìm nghiệm Chương 7: Hàm số của véc-tơ Chương 8: Phương trình vi phân thường Chương 9: Hệ các PVT Chương 10: Các hệ bậc hai Chương 11: Tối ưu hóa và nội suy Chương 12: Bây giờ véc-tơ mới thật là véc-tơ

Lời giới thiệu

Hầu hết các cuốn sách đề cập đến MATLAB đều hướng tới người đọc đã biết lập trình. Cuốn sách này dành cho những người chưa từng lập trình từ trước.

Do đó, trình tự nội dung ở đây sẽ khác thường. Cuốn sách mở đầu với các giá trị vô hướng rồi dần tiếp tục với véc-tơ và ma trận. Cách tiếp cận này rất tốt với người mới bắt đầu lập trình, vì thật khó hiểu được những kiểu đối tượng dữ liệu phức tạp trước khi bạn hiểu ý nghĩa căn bản của lập trình. Nhưng có những vấn đề sau đây nảy sinh:

  • Tài liệu MATLAB được viết dưới dạng các ma trận, và các thông báo lỗi cũng vậy. Để hạn chế nhược điểm này, cuốn sách giải thích các thuật ngữ cần thiết từ sớm và giải mã một số thông báo lỗi có thể làm người bắt đầu thấy khó hiểu.
  • Nhiều ví dụ trong nửa đầu cuốn sách không phải là viết theo phong cách MATLAB thực sự. Tôi nhận định lại vấn đề này trong phần nửa sau cuốn sách bằng việc chuyển chúng về phong cách chính thống hơn.

Cuốn sách này nhấn mạnh về các hàm số, một phần là vì chúng là cơ chế quan trọng chi phối độ phức tạp của chương trình, và cũng vì chúng rất có ích khi làm việc với các công cụ của MATLAB như fzeroode45.

Tôi định rằng bạn đọc đã biết môn toán giải tích, phương trình vi phân, và vật lý, nhưng không cần đại số tuyến tính. Tôi sẽ giải thích về toán trong suốt nội dung sách, nhưng bạn cũng cần biết toán để nắm được những đoạn giải thích đó.

Có những bài tập nhỏ trong từng chương, và một số bài tập lớn hơn ở cuối những chương nhất định.

Nếu bạn muốn góp ý và sửa chữa nội dung cuốn sách, hãy gửi ý kiến của bạn đến downey@allendowney.com.

Allen B. Downey Needham, MA

Danh sách những người góp ý cho cuốn sách

Michael Lintz ♦ Kaelyn Stadtmueller ♦ Roydan Ongie ♦ Keerthik Omanakuttan ♦ Pietro Peterlongo ♦ Li Tao ♦ Steven Zhang ♦ Elena Oleynikova ♦ Kelsey Breseman ♦ Philip Loh ♦ Harold Jaffe ♦ Vidie Pong

Cám ơn bạn đã quan tâm đón đọc cuốn sách này. Hãy vui lòng cho chúng tôi biết một số thông tin để giúp cho các bản dịch trong thời gian sắp tới phù hợp hơn với bạn.

Đoạn chương trình dưới đây trả lại một vận tốc ngẫu nhiên tuân theo hàm phân bố Maxwell kép trong trường hợp hai luồng truyền ngược nhau. Thuật toán đã dùng ở đây được gọi là phương pháp bác bỏ, và sẽ được đề cập ở phần sau của khóa học.

// Function to distribute electron velocities randomly so as   
// to generate two counter propagating warm beams of thermal  
// velocities unity and mean velocities +/- vb.  
// Uses rejection method.
double distribution [double vb]  
{   
  // Initialize random number generator  
  static int flag = 0;  
  if [flag == 0]  
    {  
      int seed = time [NULL];  
      srand [seed];  
      flag = 1;  
    }
  // Generate random v value  
  double fmax = 0.5 * [1. + exp [-2. * vb * vb]];  
  double vmin = - 5. * vb;  
  double vmax = + 5. * vb;  
  double v = vmin + [vmax - vmin] * double [rand []] / double [RAND_MAX];
  // Accept/reject value  
  double f = 0.5 * [exp [-[v - vb] * [v - vb] / 2.] +  
            exp [-[v + vb] * [v + vb] / 2.]];  
  double x = fmax * double [rand []] / double [RAND_MAX];  
  if [x > f] return distribution [vb];  
  else return v;  
}

Đoạn chương trình dưới ước tính mật độ electron trên một lưới giãn cách đều, cho trước các tọa độ tức thời của electron.

// Evaluates electron number density n[0:J-1] from   
// array r[0:N-1] of electron coordinates.
void Density [Array r, Array& n]  
{  
  // Initialize   
  double dx = L / double [J];  
  n = 0.;
  // Evaluate number density.  
  for [int i = 0; i < N; i++]  
    {  
      int j = int [r[i] / dx];  
      double y = r[i] / dx - double [j];  
      n[j] += [1. - y] / dx;  
      if [j+1 == J] n[0] += y / dx;  
      else n[j+1] += y / dx;  
    }  
}

Các hàm sau để bọc thư viện fftw với các hàm tuần hoàn.

// Functions to calculate Fourier transforms of real data   
// using fftw Fast-Fourier-Transform routine.  
// Input/ouput arrays are assumed to be of extent J.
// Calculates Fourier transform of array f in arrays Fr and Fi  
void fft_forward [Arrayf, Array&Fr,   
      Array& Fi]  
{  
  fftw_complex ff[J], FF[J];
  // Load data  
  for [int j = 0; j < J; j++]  
    {  
      c_re [ff[j]] = f[j]; c_im [ff[j]] = 0.;  
    }
  // Call fftw routine  
  fftw_plan p = fftw_create_plan [J, FFTW_FORWARD, FFTW_ESTIMATE];  
  fftw_one [p, ff, FF];  
  fftw_destroy_plan [p]; 
  // Unload data  
  for [int j = 0; j < J; j++]  
    {  
      Fr[j] = c_re [FF[j]]; Fi[j] = c_im [FF[j]];  
    }
  // Normalize data  
  Fr /= double [J];  
  Fi /= double [J];  
}
// Calculates inverse Fourier transform of arrays Fr and Fi in array f  
void fft_backward [Array Fr, Array Fi,   
      Array& f]  
{  
  fftw_complex ff[J], FF[J];
  // Load data  
  for [int j = 0; j < J; j++]  
    {  
      c_re [FF[j]] = Fr[j]; c_im [FF[j]] = Fi[j];  
    }
  // Call fftw routine  
  fftw_plan p = fftw_create_plan [J, FFTW_BACKWARD, FFTW_ESTIMATE];  
  fftw_one [p, FF, ff];  
  fftw_destroy_plan [p]; 
  // Unload data  
  for [int j = 0; j < J; j++]  
      f[j] = c_re [ff[j]];   
}

Đoạn chương trình sau giải phương trình Poisson 1 chiều để tìm điện thế tức thời trên một lưới đều.

// Solves 1-d Poisson equation:  
//    d^u / dx^2 = v   for  0 

Chủ Đề