# 求解常微分方程组
TensorFlow 可用于许多算法实现和过程。 TensorFlow 多功能性的一个很好的例子是实现 ODE 求解器。以数字方式求解 ODE 是一种迭代过程,可以在计算图中轻松描述。对于这个秘籍,我们将解决 Lotka-Volterra 捕食者 - 猎物系统。
## 做好准备
该秘籍将说明如何求解常微分方程(ODE)系统。我们可以使用与前两节类似的方法来更新值,因为我们迭代并解决 ODE 系统。
我们将考虑的 ODE 系统是着名的 Lotka-Volterra 捕食者 - 猎物系统。该系统显示了捕食者 - 食饵系统如何在给定特定参数的情况下振荡。
Lotka-Volterra 系统于 1920 年在一篇论文中发表(参见图 1,标量值,我们的斜率估计,在张量板中可视化)。我们将使用类似的参数来表明可以发生振荡系统。这是以数学上离散的方式表示的系统:
![](https://img.kancloud.cn/03/7a/037a781451b4017dfcd12c01bb6da99d_2480x220.png)
![](https://img.kancloud.cn/0b/0d/0b0d9f0d504f7626ecb9d0957d7074a5_2390x220.png)
在这里,`X`是猎物,`Y`将成为捕食者。我们通过`a`,`b`,`c`和`d`的值来确定哪个是猎物,哪个是捕食者:对于猎物,`a>0`,`b<0`和捕食者,`c<0`,`d>0`。我们将在 TensorFlow 解决方案中将此离散版本实现到系统中。
## 操作步骤
1. 我们首先加载库并开始图会话:
```py
import matplotlib.pyplot as plt
import tensorflow as tf
sess = tf.Session()
```
1. 然后我们在图中声明我们的常量和变量:
```py
x_initial = tf.constant(1.0)
y_initial = tf.constant(1.0)
X_t1 = tf.Variable(x_initial)
Y_t1 = tf.Variable(y_initial)
# Make the placeholders
t_delta = tf.placeholder(tf.float32, shape=())
a = tf.placeholder(tf.float32, shape=())
b = tf.placeholder(tf.float32, shape=())
c = tf.placeholder(tf.float32, shape=())
d = tf.placeholder(tf.float32, shape=())
```
1. 接下来,我们将实现先前引入的离散系统,然后更新`X`和`Y`群体:
```py
X_t2 = X_t1 + (a * X_t1 + b * X_t1 * Y_t1) * t_delta
Y_t2 = Y_t1 + (c * Y_t1 + d * X_t1 * Y_t1) * t_delta
# Update to New Population
step = tf.group(
X_t1.assign(X_t2),
Y_t1.assign(Y_t2))
```
1. 我们现在初始化图并运行离散 ODE 系统,并使用特定参数来说明循环行为:
```py
init = tf.global_variables_initializer() sess.run(init) # Run the ODE prey_values = [] predator_values = [] for i in range(1000): # Step simulation (using constants for a known cyclic solution) step.run({a: (2./3.), b: (-4./3.), c: -1.0, d: 1.0, t_delta: 0.01}, session=sess) # Store each outcome temp_prey, temp_pred = sess.run([X_t1, Y_t1]) prey_values.append(temp_prey) predator_values.append(temp_pred)
```
A steady state (and cyclic) solution to this specific system, the Lotka-Volterra equations, very much depends on specific parameters and population values. We encourage the reader to try different parameters and values to see what can happen.
1. 现在,我们可以绘制捕食者和猎物的价值:
```py
plt.plot(prey_values, label="Prey")
plt.plot(predator_values, label="Predator")
plt.legend(loc='upper right')
plt.show()
```
这个绘图代码将生成一个屏幕截图,显示掠食者和猎物的振荡种群:
![](https://img.kancloud.cn/95/4c/954c2702bba886034e1995d90c0bbce2_381x256.png)
图 6:在这里,我们绘制 ODE 解决方案的捕食者和猎物值。事实上,我们可以看到周期确实发生了
## 工作原理
我们使用 TensorFlow 逐步求解 ODE 系统的离散版本。对于特定参数,我们看到捕食者 - 食饵系统确实可以具有循环解。这在我们的系统生物学上是有意义的,因为如果有太多的捕食者,猎物开始死亡,然后掠食者的食物就会减少,所以他们会死掉,等等。
## 另见
Lotka,A。J.,关于有机系统中某些节奏关系的分析性说明。 PROC。纳特。科学院。 6(1920)( [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1084562/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1084562/) )。
- TensorFlow 入门
- 介绍
- TensorFlow 如何工作
- 声明变量和张量
- 使用占位符和变量
- 使用矩阵
- 声明操作符
- 实现激活函数
- 使用数据源
- 其他资源
- TensorFlow 的方式
- 介绍
- 计算图中的操作
- 对嵌套操作分层
- 使用多个层
- 实现损失函数
- 实现反向传播
- 使用批量和随机训练
- 把所有东西结合在一起
- 评估模型
- 线性回归
- 介绍
- 使用矩阵逆方法
- 实现分解方法
- 学习 TensorFlow 线性回归方法
- 理解线性回归中的损失函数
- 实现 deming 回归
- 实现套索和岭回归
- 实现弹性网络回归
- 实现逻辑回归
- 支持向量机
- 介绍
- 使用线性 SVM
- 简化为线性回归
- 在 TensorFlow 中使用内核
- 实现非线性 SVM
- 实现多类 SVM
- 最近邻方法
- 介绍
- 使用最近邻
- 使用基于文本的距离
- 使用混合距离函数的计算
- 使用地址匹配的示例
- 使用最近邻进行图像识别
- 神经网络
- 介绍
- 实现操作门
- 使用门和激活函数
- 实现单层神经网络
- 实现不同的层
- 使用多层神经网络
- 改进线性模型的预测
- 学习玩井字棋
- 自然语言处理
- 介绍
- 使用词袋嵌入
- 实现 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 进行预测
- 使用 doc2vec 进行情绪分析
- 卷积神经网络
- 介绍
- 实现简单的 CNN
- 实现先进的 CNN
- 重新训练现有的 CNN 模型
- 应用 StyleNet 和 NeuralStyle 项目
- 实现 DeepDream
- 循环神经网络
- 介绍
- 为垃圾邮件预测实现 RNN
- 实现 LSTM 模型
- 堆叠多个 LSTM 层
- 创建序列到序列模型
- 训练 Siamese RNN 相似性度量
- 将 TensorFlow 投入生产
- 介绍
- 实现单元测试
- 使用多个执行程序
- 并行化 TensorFlow
- 将 TensorFlow 投入生产
- 生产环境 TensorFlow 的一个例子
- 使用 TensorFlow 服务
- 更多 TensorFlow
- 介绍
- 可视化 TensorBoard 中的图
- 使用遗传算法
- 使用 k 均值聚类
- 求解常微分方程组
- 使用随机森林
- 使用 TensorFlow 和 Keras