def gamma_func(x, b): return idx**b * x**(b-1)/math.factorial(b-1) * np.exp(-idx*x)如果b是正整数,应该怎样设置
时间: 2023-08-04 15:06:45 浏览: 61
如果 b 是正整数,那么阶乘部分可以直接计算,不需要调用 `math.factorial` 函数。可以将这部分改写为循环的形式,如下所示:
```python
def gamma_func(x, b):
result = 1
for i in range(1, b):
result *= i
return idx**b * x**(b-1)/result * np.exp(-idx*x)
```
这里的循环从 1 循环到 b-1,每次将 i 与 result 相乘,最终得到 (b-1)! 的值。然后将其代入原来的公式中即可。
相关问题
# 定义目标函数 def func(x): return np.sum(x ** 2)
替换后的代码如下:
```
function dz = Fish_SEIR(t, z, k)
beta1 = k(1);
mu1 = k(2);
gamma1 = k(3);
delta1 = k(4);
xi = k(5);
dz = zeros(5, 1);
dz(1) = -beta1 * z(1) * z(3) - xi * z(1);
dz(2) = beta1 * z(1) * z(3) + xi * z(1) - mu1 * z(2);
dz(3) = mu1 * z(2) - gamma1 * z(3);
dz(4) = gamma1 * z(3) - delta1 * z(4);
dz(5) = delta1 * z(4);
end
function y = Func_to_optimize(k0, z0, tspan0)
load('fishdata.mat')
T = tspan0(1):0.1:tspan0(2);
[t, y] = ode45(@Fish_SEIR, T, z0, [], k0);
cdata = cumsum(data);
e = y(1:10:end) - cdata;
y = sum(e.^2);
end
```
这里将原来的函数名 `Diff_report` 改为了 `Func_to_optimize`,并且在函数体内计算了模拟结果与数据之间的残差平方和,作为目标函数的返回值。
target_q_batch = reward_batch + self.gamma * (1 - done_batch) * (next_q_batch - self.alpha * tf.math.log(next_action_batch.prob(action_batch) + 1e-8))
这段代码中的`next_action_batch.prob(action_batch)`指的是在`next_action_batch`中选择`action_batch`的概率。具体来说,`next_action_batch`是一个包含下一个状态的所有可行动作的概率分布,`action_batch`是从这个概率分布中选择的动作,`prob(action_batch)`即为选择该动作的概率。
在这段代码中,`next_q_batch - self.alpha * tf.math.log(next_action_batch.prob(action_batch) + 1e-8)`是使用了actor-critic算法中的一个trick,即将actor的输出(动作概率分布)作为critic的输入来估计Q值,从而减少action和critic之间的差异。其中,`self.alpha`是一个超参数,用来平衡actor和critic的贡献。
需要注意的是,`next_action_batch.prob(action_batch)`中的`action_batch`是一个整数索引,而不是一个one-hot向量。如果`action_batch`是一个one-hot向量,那么可以使用`tf.reduce_sum(next_action_batch * action_batch, axis=-1)`来计算其概率。