此刻,我正在写我的学士论文,而且我不得不第一次用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次付款,并且由于缺少关于指数取什么的知识,因此我无法将其修改为线性方程式。
我希望有人能帮助我。
期待收到任何人的来信。
答案 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
}
请记住,作为一个新手,如果您要编写带有大量嵌套括号的复杂多行表达式,则几乎总是会犯错。像瘟疫一样避免它们!将它们划分为可理解的表达式。