有没有办法解无根方程?

Is there a way to solve an equation without a root?

目前我正在写我的学士论文,我必须第一次用 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河但不知道该怎么做。我尝试了几个函数,如 uniroot、unroot.all、...但没有找到解决方案。此外,一个真正的问题是,在我的主要方程式中,我对 20 笔付款进行了折扣,并且由于缺少关于如何处理指数的知识,我无法将其修改为线性方程式。

我希望有人能帮助我。

期待收到任何人的来信。

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

发挥你的作用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
}

并假设您想找到函数 q 为零的 ytc 的值,那么您可以使用 uniroot 如下:

uniroot(q, c(0,10))

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

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

似乎工作得很好。

您的函数有问题,因为运算符^(求幂)优先于运算符*(乘法)。 foo^4*bar 表示(在几乎任何编程语言中,^ 表示求幂)"calculate foo^4 and then multiply the result by 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
}

请记住,作为新手,如果您要编写带有大量嵌套括号的复杂 multi-line 表达式,您几乎总是会出错。像躲避瘟疫一样避开它们!将它们分解成易于理解的表达方式。