Python tăng trưởng theo cấp số nhân

Như đã đề cập ở trên, có một giải pháp phân tích cho mô hình tăng trưởng logistic được đưa ra trong phương trình. 5, mặc dù nó khó giải hơn phương trình. 1. Vì lợi ích của hậu thế, chúng tôi sẽ giải phương trình vi phân tăng trưởng logistic và vẽ nó trên giải pháp được tìm thấy thông qua tích hợp số. Bằng cách tách các biến, chúng ta có thể viết lại phương trình. 5 như

$$ rdt = {dN \over N\left(1 - {N \over K}\right)} \tag{6} $$

Bây giờ chúng ta có thể tích hợp cả hai bên,

$$ \int r dt = \int {1 \over N \left(1 - {N \over K}\right)} dN, \tag{7} $$

nhưng tích phân ở vế phải của phương trình. 7 là khá khó khăn để giải quyết. Ở bước đầu tiên, chúng ta có thể sử dụng phép phân tách từng phần để chia tích phân thành hai phần,

$$ {1 \over rN\left(1 - {N \over K}\right)} = {A \over N} + {B \over 1 - {N \over K}}, \tag{8} $

trong đó $A$ và $B$ là các hằng số chưa biết. Chúng ta có thể xóa các phân số khỏi phương trình. 8 như

$$ 1 = A\left(1 - {N \over K}\right) + BN. \tag{9} $$

Công thức này cho phép chúng ta xác định các hằng số $A$ và $B$ bằng cách xem xét cực trị. Khi $N = 0$, phương trình. 9 trở thành

$$ 1 = A\times(1 - 0) + B\times 0 \tag{10}, $$

điều đó có nghĩa là

$$ A = 1. \tag{10} $$

Ngược lại, khi $N = K$, ta thấy giá trị của $B$ là

$$ B = {1 \over K} \tag{11}. $$

Tích phân bên phải trong phương trình. 7 bây giờ có thể được viết lại như

$$ \int {1 \over rN\left(1 - {N \over K}\right)} = \int {1 \over N} dN + \int {{1 \over K} \over 1 - {N . \tag{12} $$

Sử dụng thay thế u cho tích phân bên phải trong biểu thức. 12, bây giờ chúng ta có thể quay lại Eq. 7 và tích hợp cả hai bên, đến

$$ rt + C = \ln N - \ln \left(1 - {N \over K}\right) \tag{13}, $$

trong đó $C$ là hằng số tích phân. Luỹ thừa cả hai vế của phương trình. 13 ands giải quyết lợi tức $N$

$$ N = {e^C e^{rt} \over 1 + {e^{c}e^{rt} \over K}} \tag{14}. $$

Chúng ta có thể biến cái này thành một dạng thân thiện hơn bằng cách nhân phần trên và phần dưới với $Ke^{-rt}$ để có được

$$ N = {e^C K \over Ke^{-rt} + e^C}. \tag{15} $$

Chúng ta vẫn còn hằng số tích phân $C$ quanh quẩn trong phương trình của mình. Chúng ta có thể xác định hằng số này bằng cách nhận thấy rằng tại thời điểm ban đầu $t = 0$, số ô $N_0$ là

$$ N_0 = {e^C K \over K + e^C}. \tag{16}, $$

mà, với một số sắp xếp lại, mang lại cho chúng ta

$$ e^C = {N_0 K \over K - N_0}. \tag{17} $$

Bây giờ chúng ta có thể cắm lại vào Eq. 15 và thực hiện một số phép toán đại số để đi đến giải pháp phân tích của chúng tôi cho số lượng ô tại thời điểm $t$ là

$$ N(t) = {N_0 K \over e^{-rt}(K - N_0) + N_0}. \tag{18} $$

Mặc dù vẫn có thể quản lý được, nhưng điều này gần như không tầm thường bằng việc tìm ra giải pháp phân tích cho sự tăng trưởng theo cấp số nhân không giới hạn được đưa ra như Eq. 1. Để kiểm tra nhanh chóng, chúng ta có thể vẽ giải pháp phân tích này trên các kết quả từ tích hợp số của chúng ta

Trong các ứng dụng trong thế giới thực, mục tiêu của mô hình hóa thường là biểu diễn hành vi của các hiện tượng tự nhiên thay đổi theo thời gian trong các mô hình toán học với khả năng khái quát hóa tốt nhất. Nhiều mô hình khác nhau đã được phát triển và chứng minh là nắm bắt rất tốt những hành vi đó. Có nhiều mô hình khác nhau để mô hình hóa các vấn đề khác nhau

Hồi quy tuyến tính là mô hình được biết đến rộng rãi trong mô hình hóa do tính đơn giản và khả năng sử dụng ở cấp cơ sở. Tuy nhiên, hầu như tất cả các vấn đề trong thế giới thực là phi tuyến. Do đó, hồi quy tuyến tính vẫn có ứng dụng hạn chế trong các bài toán quan trọng

Tuy nhiên, hàm ý không phải là hồi quy tuyến tính là không đáng kể. Ngược lại, do chi phí tính toán rẻ so với các mô hình phi tuyến, hầu hết các mô hình phi tuyến thường được chuyển đổi sang không gian tuyến tính nơi chúng ta ước lượng các tham số chưa biết của chúng, sau đó chúng ta ánh xạ vào không gian ban đầu

Một kịch bản có thể xảy ra khi một mô hình khác ngoài hồi quy tuyến tính có thể được yêu cầu là trong tình huống tăng trưởng nhanh hoặc suy giảm nhanh chóng

Trong những trường hợp như vậy, các quy trình có xu hướng tăng gấp đôi thời gian, tôi. e. , thời gian cần thiết để một lượng tăng gấp đôi. Trong cuộc sống thực, thời gian nhân đôi có thể được chứng kiến ​​trong các lĩnh vực như;

Do đó, hàm mũ có thể là mô hình thích hợp để mô hình hóa các quá trình này

Trong bài viết này, chúng ta sẽ tìm hiểu cách biểu diễn giả thuyết hàm mũ, cách tính gần đúng các tham số của nó, điều chỉnh đường cong bằng Python và cuối cùng là trình bày mô hình của chúng ta bằng cách sử dụng các tham số được trả về trong Python

Cuối cùng, sử dụng mô hình đã nêu của chúng tôi, chúng tôi sẽ dự đoán một số giá trị trong tương lai

điều kiện tiên quyết

  • Kiến thức tốt về các phương pháp tối ưu hóa, đặc biệt là Phương pháp chia đôi sẽ được yêu cầu trong phần này
  • Hiểu biết tốt về các hàm Python

Giới thiệu về Hàm số mũ

Như chúng tôi đã nói trước đây, hàm mũ là mô hình được sử dụng để giải thích hành vi tự nhiên khi hệ thống trải qua tốc độ tăng trưởng gấp đôi. Mô hình này có dạng

$1. ,,,y = A_0e^{bt}$,

hoặc là;

$2. ,,,y = A_0e^{-bt}$ ở đâu

  • t là bất kỳ thời điểm nào,
  • y là giá trị của hàm tại bất kỳ thời điểm t nào,
  • $A_0$ là giá trị của mô hình tại $t=0$,mục tiêu của
  • $e$ là hằng số Euler, thường bằng 2. 71828…, và,
  • b là hằng số xác định tốc độ thay đổi

Mô hình đầu tiên, tôi. e. , $(1)$, mô hình hóa các quy trình nhân lên theo thời gian. Vì vậy, nó là một mô hình cho sự tăng trưởng nhanh chóng. Trường hợp thứ hai, tôi. e. , $(2)$, lập mô hình quá trình phân rã nhanh chóng theo thời gian. Một ví dụ tuyệt vời về nơi áp dụng mô hình này là mô hình phân rã phóng xạ

Bây giờ, giả sử chúng ta cho $(x_1,y_1),,(x_2,y_2),,. ,. ,. ,,(x_n,y_n)$, và chúng tôi dự kiến ​​sẽ khớp, $y=e^{bx},$ với dữ liệu

Hằng số $a$ và $b$ là các tham số chưa biết của mô hình. Vì vậy, chúng phải được ước lượng. Nhưng, trước tiên, chúng ta cần xác định hàm mất mát để ước tính các tham số này

Hàm mất mát chỉ đơn giản là độ lệch của các giá trị dự đoán từ các giá trị được quan sát. Vì vậy, trước tiên chúng tôi thu được phần dư cho từng điểm dữ liệu như bên dưới

$E_i=y_i-ae^{bx_i}$

Sau đó, chúng tôi tính tổng các phần dư trên tất cả các ví dụ về tập huấn luyện. Điều này mang lại cho chúng ta Tổng bình phương Dư (SSR) như hình bên dưới

$S_i=\sum_{i=1}^{n} (y_i-ae^{bx_i})^2 = \sum_{i=1}^{n} E_i$,

Trong đó n là số trường hợp trong tập huấn luyện

Để tính gần đúng các hằng số a và b, ta cực tiểu hóa hàm loss ở trên, i. e. , SSR, bằng cách lấy đạo hàm của nó theo a, b và đánh các phương trình kết quả bằng 0

Chúng tôi thực hiện điều này như sau

  • Phân biệt chức năng lỗi đối với $a$

$\large {\frac{\delta S}{\delta a}= \sum_{n=1}^{n} 2(y_i-ae^{bx_i})(-e^{bx_i})=0}$

  • Phân biệt chức năng lỗi đối với $b$

$\large{\frac{\delta S}{\delta b}= \sum_{n=1}^{n} 2(y_i-ae^{bx_i})(-ax_ie^{bx_i})=0}$

Các phương trình này có thể được biểu thị dưới dạng

$\large \frac{\delta S}{\delta a}= \sum_{n=1}^{n} y_ie^{bx_i} + a \sum_{n=1}^{n} e^{2bx_i} . \. \. \. \ (1. 0)$

$\large \frac{\delta S}{\delta b}= \sum_{n=1}^{n} y_ix_ie^{bx_i} - a \sum_{n=1}^{n} x_ie^{2bx_i} . \. \. \. \ (1. 1)$

phương trình $1. 0$ và $1. 1$ là phi tuyến tính trong $a$ và $b$ và do đó không ở dạng đóng để được giải như trong trường hợp hồi quy tuyến tính

Nhìn chung, các phương pháp lặp như phương pháp lặp Gauss Newton, Phương pháp giảm dốc nhất, Phương pháp tìm kiếm trực tiếp, e. t. c có thể được áp dụng để xác định giá trị của $a$ và $b$

Lưu ý, từ phương trình $1. 0$, $a$ có thể biểu diễn dưới dạng $b$, i. e. ,

${\Large a= \frac{\sum_{i=1}^{n} y_ie^bx_i}{\sum_{i=1}{n} e^{2bx_i}}};,. ,. ,. ,. , (1. 2)$

Thay phương trình $1. 2 đô la trong 1 đô la. 1 đô la cho

$\Large \frac{\delta S}{\delta b}= \sum_{n=1}^{n} y_ix_ie^{bx_i} - {\frac{\sum_{i=1}^{n} y_ie^ . \. \. \. \ 5(b)$

Như chúng ta có thể thấy, phương trình này vẫn là phi tuyến trong $b$. Tuy nhiên, sử dụng phương pháp chia đôi, chúng ta có thể xác định được $b$

Để hiểu rõ ràng, chúng ta hãy xem xét một ví dụ và xem làm thế nào chúng ta có thể áp dụng các công thức trên vào thực tế

Vấn đề

Nhiều bệnh nhân lo lắng khi xét nghiệm có tiêm chất phóng xạ. Ví dụ, một vài giọt đồng vị Technetium-99m được sử dụng để quét túi mật. Một nửa số technetium-99m sẽ biến mất sau khoảng 6 giờ. Tuy nhiên, phải mất khoảng 24 giờ để mức độ bức xạ đạt đến mức mà chúng ta tiếp xúc trong các hoạt động hàng ngày. Dưới đây là cường độ tương đối của bức xạ như là một hàm của thời gian

Python tăng trưởng theo cấp số nhân

Mức cường độ tương đối của bức xạ liên quan đến thời gian thông qua hàm số mũ $γ = Ae^{\lambda t}$. Chúng tôi bắt buộc phải tìm

a) các tham số của mô hình, i. e. , A và λ, b) cường độ bức xạ sau 24 giờ

Hãy để chúng tôi giải quyết vấn đề này trước bằng tay và sau đó thực hiện mô hình

$\Large\gamma=Ae^{\lambda t}$

Giá trị của $\lambda$ được đưa ra bằng cách giải phương trình phi tuyến tính của

${\Large {f(\lambda) = \sum_{n=1}^{n} \gamma_i t_ie^{\lambda t_i} - \frac{\sum_{i=1}^{n} \gamma_i e^ . \. \. (8)$ Sau đó chúng tôi đánh giá A là

$\Large A= \frac{\sum_{i=1}^{n} \gamma_ie^{\lambda t_i}}{\sum_{i=1}{n} e^{2 \lambda t_i}}$

Sử dụng phương pháp chia đôi, chúng ta hãy thử giải phương trình $8$ cho $\lambda$

Đầu tiên chúng tôi ước tính dự đoán ban đầu của chúng tôi là

$\lambda=-0. 120$ và

$\lambda=-0. 110$

Trước tiên, chúng ta cần kiểm tra xem những dự đoán này có chứa nghiệm của phương trình của chúng ta trong khoảng của chúng không, i. e. , $f(-\lambda)\times$$f(\lambda)<0$

Khi $\lambda=-0. 120$ chúng tôi đánh giá $f(-0. 120)$ như trong bảng

Python tăng trưởng theo cấp số nhân

Từ bảng này, $f(-0. 120)=(6. 2501)-\frac{2. 9062}{2. 8763}(6. 0954)=0. 091357$

Tương tự, chúng ta có thể tính $f(− 0. 110)=−0. 10099$

Hàm $f(\lambda)$ đổi dấu giữa $\lambda=-0. 120$ và $\lambda=-0. 110$, do đó gốc tồn tại giữa khoảng $[-0. 110,-0. 120]$. Tiếp tục với phương pháp chia đôi, chúng ta tính giá trị của $\lambda$ sao cho $f(\lambda)=0$ sau 20 lần lặp là $\lambda = −0. 11508$. Giải pháp này đạt được với độ chính xác của sai số tương đối tuyệt đối nhỏ hơn $0. 000008%$

Sử dụng phương trình $1. 2$, chúng ta có thể tính giá trị cho $a$ như sau

$\Large{ a= \frac{\sum_{i=1}^{n} \gamma_ie^bt_i}{\sum_{i=1}^{n} e^{2bt_i}}};,. ,. ,. ,. , (1. 2)$

Python tăng trưởng theo cấp số nhân

$= \Lớn \frac{2. 9373}{2. 9378}$

$= 0. 99983$

Vì chúng tôi có các giá trị của cả hai tham số chưa biết, nên chúng tôi có thể nêu mô hình của mình như sau

$\gamma = 0. 99983e^{−0. 11508t}$

Bây giờ, hãy xem cách chúng tôi triển khai mô hình này bằng Python

Triển khai Python của Mô hình hàm mũ

Để triển khai mô hình, trước tiên, chúng ta cần nhập các thư viện cần thiết. Trong phiên này, chúng tôi cần các thư viện sau

  1. Numpy để làm việc với mảng dữ liệu
  2. Maltplotilib để trực quan hóa dữ liệu

Hãy để chúng tôi nhập các thư viện này

import numpy as np
import matplotlib.pyplot as plt

Tiếp theo, chúng ta hãy tạo tập dữ liệu của mình

# create the dataset
t = np.array([0,1,3,5,7,9])
y = np.array([1.000,0.891,0.708,0.562,0.447,0.355])

Chúng ta có thể thấy mối quan hệ được gạch chân giữa các biến của chúng ta bằng cách vẽ biểu đồ phân tán dữ liệu của chúng ta

#plotting the data
plt.scatter(t, y, color="green")
plt.title("Scatter Plot")
plt.show()

Python tăng trưởng theo cấp số nhân

Như chúng ta có thể thấy từ biểu đồ phân tán ở trên, dữ liệu mô tả mối quan hệ đang dần phân rã. Do đó, mô hình hàm mũ là mô hình tốt nhất để khớp đường cong với tập dữ liệu này. Bây giờ, hãy để chúng tôi phù hợp với mô hình của chúng tôi

#fit the model
the model for our data is:
y = A*exp{λt};
Taking the log on both sides of y, we get
log(y) = log(A) + λt

So to fit our model, we first take the natural log on only the y variable and not t.

model = np.polyfit(t, np.log(y), 1) # the argument 1 idicates the degree of the polynomial
# view the model's output
print(model)

đầu ra

[-0.11504963 -0.0002615 ]

Phần tử đầu tiên của kết quả mô hình ở trên là hệ số tương ứng với biến giải thích t, ​​i. e. , λ và cái thứ hai tương ứng với các giá trị của mô hình được trang bị khi $t = 0$, i. e. , log(A)

Để có được mô hình phù hợp nhất với dữ liệu đã cho, chúng tôi đã biến đổi mô hình phù hợp bằng cách lấy nghịch đảo của phép biến đổi mà chúng tôi đã thực hiện trên dữ liệu. Sử dụng các hệ số trả về, mô hình chúng tôi xây dựng như sau

$log(y) = log(-0. 11504963) -0. 0002615t$

Lấy cấp số nhân cả hai vế, ta được

$y = exp{(-0. 0002615)}e^{-0. 11504963t}$;

Đơn giản hóa điều này, chúng tôi có được mô hình cuối cùng của chúng tôi là

$y = 0. 99974e^{-0. 11504963t}$

Bây giờ, giả sử chúng ta muốn tính cường độ tương đối của bức xạ sau 24 giờ. Để làm điều này, chúng tôi cắm $t=24$ vào mô hình của mình và nhận lại kết quả, tôi. e

$y = 0. 99974e^{-0. 11504963(24)}=6. 320 \times 10^{-2}$

Vì tại $t= 0,, ,, y = 0. 99974$, sử dụng kết quả trên ta tính được phần trăm cường độ phóng xạ còn lại sau 24 giờ như sau

$\frac{6. 320 \times 10^{-2}}{0. 99974}\lần 100 %=6. 3216%$

Như vậy, chỉ $6. 3216%$ cường độ phóng xạ ban đầu sẽ vẫn còn sau 24 giờ. Đây là cách chúng tôi sử dụng mô hình hàm mũ để đưa ra dự đoán

Cuối cùng, chúng ta có thể hình dung mô hình của mình

# Visualize the model
myplot = plt.plot(t,y)
myplot

đầu ra

Python tăng trưởng theo cấp số nhân

Như chúng ta có thể thấy, mô hình của chúng ta thể hiện mối quan hệ giảm dần giống như độ cong giữa hai biến

Tóm lược

Trong bài viết này, chúng tôi đã giới thiệu mô hình hàm mũ. Trước tiên, chúng tôi đã xác định mô hình hàm mũ và vạch ra hai loại của nó. Sau đó, chúng tôi đã xem xét biểu diễn giả thuyết của nó, từ đó chúng tôi rút ra hàm mất mát

Để tính gần đúng các hằng số chưa biết của mô hình, chúng ta giải hàm lỏng lẻo bằng cách tìm các giá trị của ẩn số để giảm thiểu hàm sai số

Sau khi trình bày những điều này, chúng tôi sau đó xem xét một nghiên cứu điển hình và chúng tôi có thể áp dụng hiểu biết lý thuyết của mình về mô hình vào thực tế. Cuối cùng, chúng tôi đã triển khai mô hình của mình trong python và đưa ra dự đoán bằng cách sử dụng nó