有没有办法求解无根方程?

时间:2019-06-17 07:42:03

标签: r solver non-linear-regression

此刻,我正在写我的学士论文,而且我不得不第一次用R编程。我认为这不是学习R的最佳方法,但是没关系。

我的问题是关于一个可以解决这样的方程的函数:

q <- function(ytc) {
  (5 / ((1 + (ytc / 4))^4 * ((1645 * 5 / 1826) - (1640 * 5 / 1826)))) + 
    (5 / ((1 + (ytc / 4))^4 * ((1736 * 5 / 1826) - (1640 * 5 / 1826)))) + 
    (5 / ((1 + (ytc / 4))^4 * ((1826 * 5 / 1826) - (1640 * 5 / 1826)))) + 
    100 / (((1 + (ytc / 4))^4 * ((1826 * 5 / 1826) - (1640 * 5 / 1826)))) - 100
}

我的目的是简单地为ytc解决债券赎回的收益率。但是我找不到任何解决办法。这应该是一个简单的PV计算,如:PV = c /(1 + r / 4)^ 4 * t1 + c /(1 + r / 4)^ 4 * t2 + ....因此求解vor r。但是不知道该怎么做。我尝试了uniroot,unroot.all等多个函数,但是没有办法解决问题。另外一个真正的问题是,在我的主要方程式中,我要折现20次付款,并且由于缺少关于指数取什么的知识,因此我无法将其修改为线性方程式。

我希望有人能帮助我。

期待收到任何人的来信。

2 个答案:

答案 0 :(得分:1)

我不太明白为什么你不能解方程。

执行您的功能q

q <- function(ytc) {
  (5 / ((1 + (ytc / 4))^4 * ((1645 * 5 / 1826) - (1640 * 5 / 1826)))) + 
  (5 / ((1 + (ytc / 4))^4 * ((1736 * 5 / 1826) - (1640 * 5 / 1826)))) + 
  (5 / ((1 + (ytc / 4))^4 * ((1826 * 5 / 1826) - (1640 * 5 / 1826)))) + 
  100 / (((1 + (ytc / 4))^4 * ((1826 * 5 / 1826) - (1640 * 5 / 1826)))) - 100
}

并假设要查找函数ytc为零的q的值,则可以按如下方式使用uniroot

uniroot(q, c(0,10))

,如果您想要更准确的解决方案,请使用

uniroot(q, c(0,10),tol = .Machine$double.eps^0.5)

似乎工作正常。

答案 1 :(得分:0)

您的函数有问题,因为运算符^(取幂)优先于运算符*(乘法)。 foo^4*bar的含义(实际上在任何^表示幂的编程语言中)“计算foo ^ 4,然后将结果乘以bar”。您需要(我删除了多余的括号):

q <- function(ytc) {
  5 / (1 + ytc / 4) ^ (4 * (1645 * 5 / 1826 - 1640 * 5 / 1826)) + 
  5 / (1 + ytc / 4) ^ (4 * (1736 * 5 / 1826 - 1640 * 5 / 1826)) + 
  5 / (1 + ytc / 4) ^ (4 * (1826 * 5 / 1826 - 1640 * 5 / 1826)) + 
  100 / (1 + ytc / 4) ^ (4 * (1826 * 5 / 1826 - 1640 * 5 / 1826))
  - 100
}

或更好:

x1 = 1645 * 5 / 1826 - 1640 * 5 / 1826
x2 = 1736 * 5 / 1826 - 1640 * 5 / 1826
x3 = 1826 * 5 / 1826 - 1640 * 5 / 1826
q <- function(ytc) {
    a = 1 + ytc / 4
    5 / a ** (4 * x1) + 5 / a ** (4 * x2) + 5 / a ** (4 * x3)
    + 100 / a ** (4 * x3)  - 100
}

请记住,作为一个新手,如果您要编写带有大量嵌套括号的复杂多行表达式,则几乎总是会犯错。像瘟疫一样避免它们!将它们划分为可理解的表达式。