R Как получить коэффициенты полиномиального выражения? - PullRequest
0 голосов
/ 18 декабря 2018

Привет и спасибо за ваше время,

Я понимаю, что мой вопрос на самом деле очень похож на вопрос в этой теме: Как получить коэффициенты полиномиального выражения

Однако я хотел бы уточнить этот вопрос.

Я написал программу, которая при задании вектора, заполненного коэффициентами полинома в возрастающей степени относительно мономов в этом полиноме, выведетвектор, заполненный коэффициентами примитива этого многочлена аналогичным образом.Например, когда я хочу узнать примитив выражения y = 54s ^ 2 - 36s + 3, я бы ввел вектор (3, -36, 54) в мою программу, и он вернул бы вектор (0, 3,-18, 18) так как примитив этого у составляет 18 с ^ 3 - 18 с ^ 2 + 3 с.

Код этой программы следующий:

# Define function degree
degree <- function() {

  # First asks for degree
  m1 <- readline("Please input the degree of your polynomial.")

  # Checks if degree is integer and non-negative
  m2 <- as.integer(m1)
  if ((m2 == m1)&(m1>0)) {
    print(paste("The degree of your polynomial is", m1))
  }
  if(m2 != m1) {
    print("The degree of a polynomial must be an integer.")
    degree()
  }
  if(m1 < 0) {
    print("The degree of a polynomial must be non-negative.")
    degree()
  }

  # Last output of degree is defining numeric m
  m <- as.numeric(m1)
}

# Define function polynomial
polynomial <- function() {

  # First calls on the degree function
  m <- degree()

  # Then asks for coefficients
  a <- readline("Please input the coefficients of your polynomial in order of their 
ascending degree separated by a space, such as: a[0] a[1] a[2] ... a[m]")

  # Creates vector a filled with these coefficients
  a <- strsplit(a, " ")
  a <- a[[1]]
  a <- as.numeric(a)

  # Checks if any non-numeric values were entered for the coefficients
  if (is.na(sum(a)) == TRUE) {
    print("The program does not allow for non-numeric coefficients.")
    polynomial()
  }

  # Checks if length of vector is equal to degree + 1
  if ((length(a) == m+1)) {
      print("Your polynomial can be represented by the vector:")
      print(a)
    }
  if ((length(a) != m+1)) {
    print("Please input a coefficient for the degree of each separate monomial within 
your polynomial.")
    polynomial()
  }

  # Last output of polynomial is defining numeric a
  a <- as.numeric(a)
}

# Define function primitive
primitive <- function() {

  # Call on function polynomial
  a <- polynomial()

  # Calculate the primitive
  p <- c()
  p[1] <- 0
  for (i in 1:length(a)){
    p[i + 1] <- a[i]/i 
  }
  print(paste("The degree of your primitive is", (length(p) - 1)))
  print("The primitive of your polynomial can be represented by the vector")
  print(p)
}

Теперь это, вероятно, не безупречно само по себе, но работает нормально.Однако теперь у меня есть проблема в том, что я хочу иметь возможность вычислять итерации Пикара дифференциальных уравнений в форме полинома.Теперь я совершенно уверен, что могу написать этот код сам, поэтому я буду только спрашивать, что для меня важно, чтобы продолжить свою работу.

Я, по сути, хочу иметь возможность упростить любое выражение дляполиномиальная форма (если выражение допускает это, но мы предполагаем, что это так).Например, если мое выражение равно 6 (3s - 1) ^ 2, то я хочу, чтобы R упростил это до 54s ^ 2 - 36s + 6 и поместил его в векторную форму (6, -36, 54), чтобы я могзапустить его с моей примитивной написанной программой.Я попытался использовать пакет rSympy, чтобы получить следующее:

sympy("expand(6*(3*s - 1)**2)")

, который дает мне вывод

[1] "6 - 36*s + 54*s**2"

Однако я не знаю, как получить (числовой) вектор (6, -36, 54) из этого вывода.

В нити, которую я связал, я увидел, что они использовали функцию 'gregexpr'.Однако я понятия не имею, что делает эта функция и как она работает. Я не мог на всю жизнь понять, что именно мне нужно было бы ввести в эту функцию, чтобы получить нужный мне вектор.Мне не нравится писать код, который я не понимаю.Пожалуйста, помогите и объясните!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...