使用n次方根计算r

问题描述 投票:0回答:1

我正在尝试计算特定时间的 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

我找到了这篇文章,并且能够通过创建自己的函数来使其工作,但我想知道是否已经有一个函数可以计算它而无需重新发明轮子?

在 C++ 中求数字的 n 次方根

谷歌计算器如何表达这个数学: enter image description here

这可行,但是有更好的方法吗?

/*由 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 的搜索结果,但没有看到任何可以回答这个问题的内容。我的代数和计算成绩很好,但不是数学家。

感谢您的帮助, /转网

c++ exponential rate
1个回答
0
投票

当 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 )

这个答案对于全机器精度来说应该是好的。

© www.soinside.com 2019 - 2024. All rights reserved.