Есть ли способ решить уравнение без корня?

на данный момент я пишу свою бакалаврскую диссертацию и мне впервые нужно программировать на 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 платежей, и я еще не смог изменить его как линейное уравнение из-за отсутствия знаний о том, что делать с показателями степени.

Я надеюсь, что кто-нибудь может мне помочь.

Жду ответа от кого-либо.


person Leon    schedule 17.06.2019    source источник
comment
Просто чтобы уточнить: функция, которую я написал, имеет форму c / (1 + r / 4) ^ 4 * t-PV = 0, поскольку я пробовал uniroot и т. Д., Которые не дали никаких решений.   -  person Leon    schedule 17.06.2019
comment
Вы говорите, что у вас есть уравнение c/(1+r/4)^4*t-PV=0. Что такое PV? Это константа, или переменная, или произведение двух переменных P и V, или что-то еще? Вы должны решить это уравнение относительно какой переменной: c, v, r, PV?   -  person user31264    schedule 17.06.2019
comment
Помните, мы знаем язык R, а некоторые из нас разбираются в математике, но у нас нет никаких знаний о проблеме, которую вы пытаетесь решить. Мы не знаем, что означает каждая переменная, что означает ytc (или любой другой акроним), что вы хотите узнать, где находятся аббревиатуры, а где произведения переменных, или что-то еще. Мы тоже не хотим гадать.   -  person user31264    schedule 17.06.2019
comment
@ user31264 Приносим извинения за неудобства! Это мой первый пост, поэтому я не так точно выражаю свою проблему. : / вы можете представить уравнение следующим образом: это простое уравнение вида y = c / (1 + x / 4) ^ 4 * t, где все известно, кроме x, которое я хочу найти. Это означает, что ytc = x.   -  person Leon    schedule 17.06.2019
comment
Это должно быть c / (1+ (x / 4)) ^ (4 * t)   -  person Leon    schedule 17.06.2019


Ответы (2)


Я не совсем понимаю, почему вы не можете решить свое уравнение.

Возьмите свою функцию 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)

Кажется, неплохо работает.

person Bhas    schedule 17.06.2019

В вашей функции есть ошибки, потому что оператор ^ (возведение в степень) имеет приоритет над оператором * (умножение). 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
}

Помните, как новичок, если вы напишете сложное многострочное выражение с огромным количеством вложенных скобок, вы почти всегда ошибетесь. Избегайте их, как чумы! Разделите их на понятные выражения.

person user31264    schedule 17.06.2019
comment
Кажется, что результаты не совсем точные. По крайней мере, для моей цели. Может быть, есть еще одна функция, которую я мог бы использовать для определения значения? - person Leon; 18.06.2019