有没有办法解无根方程?
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 表达式,您几乎总是会出错。像躲避瘟疫一样避开它们!将它们分解成易于理解的表达方式。
目前我正在写我的学士论文,我必须第一次用 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 表达式,您几乎总是会出错。像躲避瘟疫一样避开它们!将它们分解成易于理解的表达方式。