如何简化R中x的函数与微积分上下文之间的差异?

时间:2017-06-04 11:26:22

标签: r

首先,这看起来像是一个相当数量的微积分,所以我预测它会转发到Cross-Validated,认为这是TL; DR。但我认为这是一个编程问题,所以我在这里。

想象一下,我在x方面有以下函数:f(x),g(x),h(x)...

f(x)= 2x ^ 2 + 4x - 30

g(x)= x ^ 2 - x + 12

h(x)= f(x) - g(x)=(2x ^ 2 + 4x - 30) - (x ^ 2 - x + 12)= x ^ 2 + 5 * x - 42

注意:如果我在这里计算g(x) - f(x),我会得到一个不同的多项式,但我会得到相同的根,所以它并不重要,因为如果我从g中取系数( x) - f(x),然后polyroot()将返回与f(x)= g(x)相同的x截距交点。

我能够解析h(x)=(2x ^ 2 + 4x - 30) - (x ^ 2 - x + 12),但我无法将其解析为x ^ 2 + 5 * x - 42这只是h(x)相同函数的更简化版本。但我需要以这种形式计算这些函数的交点,我需要差函数的系数。然后我会使用交点来计算函数相对于函数交叉范围内的较小函数的差积分,而这个差积分就是函数之间的区域。

所以我的目标是计算两个相交函数之间的区域。

我的问题是我想要自动化整个过程,我想简单地将h(x)差函数转换为1 * x ^ 2 + 5 *(x) - 42,其中这个多项式函数的系数在递增顺序依次为-42,5,1。

所以,让我们编写代码:

  

fx< - function(x){2 * x ^ 2 + 4 * x - 30}

     

gx< - function(x){1 * x ^ 2 - 1 * x + 12}

     

hx< - function(x){fx - gx}#不起作用,因为我无法将其传递给曲线(hx)

     

hx< - function(x){(2 * x ^ 2 + 4 * x - 30) - (1 * x ^ 2 - 1 * x + 12)}#works   但它不是我想要的形式。

> hx
function(x){(2*x^2 + 4*x - 30) - (1*x^2 - 1*x + 12)}
<bytecode: 0x000000001c0bfc10>

错误:

> curve(hx)

Error in expression(fx) - expression(gx) : 
  non-numeric argument to binary operator

看到这就是我需要系数的原因。

> z <- polyroot(c(-42, 5, 1)) # polyroot functions give you the x-intercepts of a polynomial function. 
> z
[1]  4.446222-0i -9.446222+0i

当然,我可以在笔和纸上计算“x ^ 2 + 5 * x - 42”,但他们说程序员总是希望找到最有效的算法流程,而且工作量最少。

现在我需要在给定范围内查看哪个函数大于另一个函数。视觉或增量两种方式。 (这是针对微积分II的部分。)

  

x = seq(从= -9.4,到= 4.4,乘以= 0.2)
  fx_range = 2 * x ^ 2 + 4 * x - 30

> table(fx_range >= gx_range)

FALSE 
   70 
> table(gx_range >= fx_range)

TRUE 
  70 

看起来g(x)函数在交叉点范围内大于或等于f(x)函数。因此,应根据微积分计算g(x) - f(x)的积分。我刚刚为多根函数做了f(x) - g(x)。

曲线之间的 =(从-9.446222到4.446222)∫[g(x) - f(x)] dx

=(从-9.446222到4.446222)∫[(x ^ 2 - x + 12) - (2 * x ^ 2 + 4 * x - 30)]

  

gx_minus_fx = function(x){(x ^ 2 - x + 12) - (2 * x ^ 2 + 4 * x - 30)}

     

Area = integrate(gx_minus_fx,lower = -9.446222,upper = 4.446222)

     

区   446.8736,绝对误差< 5e-12#这正是我想要计算的!

现在让我们以图形方式检查我是否应该减去g(x) - f(x):

> curve(fx, main = "Functions with their Intersection Points", xlab = "x", ylab = "Functions of x", from = -9.446222, to = 4.446222)
> curve(gx, col = "red", add = TRUE)
> legend("topright", c("f(x) = 2x^2 + 4x - 30", "g(x) = x^2 - x + 12"), fill = c("black", "red"))

Functions with Their Intersections

是的,我做对了!

所以,我想要帮助的是弄清楚如何简化 h(x)= f(x)-g(x)至x ^ 2 + 5 * x-42。 这似乎是一个代数问题。我展示了我可以在R中做高级微积分2,我想知道是否有一种方法可以自动完成h(x)函数的整个过程。

谢谢!!!

0 个答案:

没有答案