我正在尝试计算特定时间的 r,或 f(t_max)。我使用的范围是 0 到 255。所以我试图计算 t_max = 255 时指数增长的正确速率值,初始值为 500,最大值为 3500。
指数增长: f(x) = a(1+r)^x
想要解决 r:
3500 = 500(1+r)^255
3500/500 = (1+r)^255
7 = (1+r)^255
255 n_root(7) = (1+r)
1.00766 - 1 = r
我找到了这篇文章,并且能够通过创建自己的函数来使其工作,但我想知道是否已经有一个函数可以计算它而无需重新发明轮子?
这可行,但是有更好的方法吗?
/*由 stackoverflow 帖子构建: 在 C++ 中查找数字的第 n 次根 */
指数_增长.h:
/*Built from stackoverflow post:
https://stackoverflow.com/questions/21141447/find-nth-root-of-a-number-in-c?newreg=3a7ef9dc2a444e01b0a25ac3cc4a83d1
*/
#include <iostream>
#include <math.h>
using namespace std;
double exp(double, double);
double n_root_(double, double);
double exp(double a, double b){
double t(1);
for(int i = 0;i<b;++i)
t *= a;
return t;
}
double n_root_(double num, double n_){
double x;
double A(num);
double dx;
double eps(10e-6);
double n(n_);
x = A * 0.5;
dx = (A/exp(x,n-1)-x)/n;
while(dx >= eps || dx <= -eps){
x = x + dx;
dx = (A/exp(x,n-1)-x)/n;
}
return x;
}
double find_rate(double initial_value, double final_value, double t_max){
double root_value_ratio = (final_value / initial_value);
return ((n_root_(root_value_ratio, t_max) - 1));
}
double exponential_growth_value_at_t(double initial_value, double final_value, double t){
double r = find_rate(initial_value, final_value, t);
double egvat = (initial_value * pow((1 + r), t));
return egvat;
}
用途:
//Per my previous stated values
double initial_value = 500;
double final_value = 3500;
double t_max = 255
t = 128;
fr = find_rate(initial_value, final_value, t_max);
fr = 0.00766021063
egvt = exponential_growth_value_at_t(initial_value, final_value, 128);
fr = 0.00766021063 EGVT = 1327.9327
t = 128 时的增长:1327.9327
这可行,但不如@starsplusplus发布的那么准确
double exponential_growth_value_at_t(double initial_value, double final_value, double t, double t_max){
double r = (log(final_value / initial_value) / t_max);
double egvat = (initial_value * pow((1 + r), t));
return egvat;
}
我确实阅读了所有关于 n 次方根来求解 r 的搜索结果,但没有看到任何可以回答这个问题的内容。我的代数和计算成绩很好,但不是数学家。
感谢您的帮助, /转网
当 x 变大时,有一个技巧可以得到准确的答案,否则你最终会从只比 1 本身稍大一点的东西中减去 1,然后就会发生灾难性的抵消。
幸运的是,大多数数学库通常都有类似于 expm1 的东西,它可以计算小 x 的 exp(x)-1 的准确值,而不会产生任何取消误差。
从
学习代数 7 = (1+r)^255
ln 7 = 255 ln(1+r)
exp( (ln 7)/255 ) = 1+r
r= exp( (ln 7)/255 ) - 1
r = expm1((ln 7)/255 )
这个答案对于全机器精度来说应该是好的。