如何在r中使用基于矩阵的函数的多重根

如何在r中使用基于矩阵的函数的多重根,r,math,R,Math,我有一个必须以矩阵形式调用的函数。我曾尝试使用包rootSolve中的multiroot来计算根,但根本不起作用。有没有一种方法可以重新定义下面的函数,或者有没有另一种基于牛顿-拉斐逊技术的方法 library(rootSolve) f <- function(q,m){ c(F1 = 12 * ((exp(q[, 1]) * m[1])/(exp(q[, 1]) * m[1] + exp(q[, 2]) * m[2] + m[3])) - c(1,2),

我有一个必须以矩阵形式调用的函数。我曾尝试使用包
rootSolve
中的
multiroot
来计算根,但根本不起作用。有没有一种方法可以重新定义下面的函数,或者有没有另一种基于牛顿-拉斐逊技术的方法

library(rootSolve)

  f <- function(q,m){
      c(F1 = 12 * ((exp(q[, 1]) * m[1])/(exp(q[, 1]) * m[1] + exp(q[, 2]) * m[2] + m[3])) - c(1,2),
        F2 = 12 * ((exp(q[, 2]) * m[2])/(exp(q[, 1]) * m[1] + exp(q[, 2]) * m[2] + m[3])) -c(3,3))
    }
    m = c(0.1,0.2,0.7)
库(rootSolve)

f将其包装在执行转换的外部函数中。由于问题已更改,请注意,我们使用了结尾处注释中显示的原始数据

multiroot(function(q) f(t(q), m), c(1,1))
给予:

$root
[1] -14.67979 -14.67979

$f.root
          F1           F2 
5.618059e-06 1.123612e-06 

$iter
[1] 13

$estim.precis
[1] 3.370836e-06
注 假设f和m为:

库(rootSolve)


f将其包装在执行转换的外部函数中。由于问题已更改,请注意,我们使用了结尾处注释中显示的原始数据

multiroot(function(q) f(t(q), m), c(1,1))
给予:

$root
[1] -14.67979 -14.67979

$f.root
          F1           F2 
5.618059e-06 1.123612e-06 

$iter
[1] 13

$estim.precis
[1] 3.370836e-06
注 假设f和m为:

库(rootSolve)


f您的函数没有解决方案。您可以看到,函数值表达式中的分子是相同的,并且在给定
m
的值时始终为正。 因此,您试图求解
exp(q[,1])*m[1]=0
exp(q[,2])*m[2]=0
。 这是不可能的,因为
exp(…)
总是大于零


如果您尝试为
q
使用不同的起始值,您将得到不同的答案。

您的函数没有解决方案。您可以看到,函数值表达式中的分子是相同的,并且在给定
m
的值时始终为正。 因此,您试图求解
exp(q[,1])*m[1]=0
exp(q[,2])*m[2]=0
。 这是不可能的,因为
exp(…)
总是大于零


如果您尝试为
q
使用不同的起始值,您将得到不同的答案。

我刚刚注意到它,并对其进行了编辑。但同样地,
exp
只涵盖
q的
。我的意思是
(exp(q[,1])
。我希望这在更正后更有意义。我刚刚注意到了它,并对它进行了编辑。但是
exp
只涵盖
q的
。我的意思是
(exp(q[,1])
。我希望这在更正后更有意义
t()
do?我以为它可能在做转置,但我没有得到我预期的结果。我预期第一个函数的结果是
-0.13353114,0.6931472
,第二个函数的结果是
0.2719337,0.4054651
。但我也注意到当
c(1,2)时,我得到了类似的结果
第一个函数替换为
c(1,3)
。第二个函数
c(3,3)
替换为
c(2,3)
。显然是一些转置。
t(x)
x的转置。对于纯向量,它与
矩阵(x,1)
相同。注意
多根(函数(q)f(t(q),m),c(1,1))$f.root
,是
c(0,0)
使用问题中的
f
m
转换为6位数字。你不会像另一个答案中所解释的那样得到精确的零,即两个正数的比率不能为零,而且即使解存在,也只能期望解达到数值近似。我实际上编辑了问题,但很快当我这样做的时候,我收到了一个错误。我对
q
的预期解决方案是
q我从你的解释中意识到的另一件事。
q
是一个矩阵,得到它的转置会改变一切。如果它是一个向量,就不会有任何问题。如果你改变问题,那么你需要改变答案来对应。如果f和m是a修改后的问题中的s和q是您评论中显示的矩阵,然后使用
multiroot(函数(q)f(矩阵(q,2),m),q)
什么是
t()
do?我以为它可能在做转置,但我没有得到我预期的结果。我预期第一个函数的结果是
-0.13353114,0.6931472
,第二个函数的结果是
0.2719337,0.4054651
。但我也注意到当
c(1,2)时,我得到了类似的结果
第一个函数替换为
c(1,3)
。第二个函数
c(3,3)
替换为
c(2,3)
。显然是一些转置。
t(x)
x的转置。对于纯向量,它与
矩阵(x,1)
相同。注意
多根(函数(q)f(t(q),m),c(1,1))$f.root
,是
c(0,0)
使用问题中的
f
m
转换为6位数字。你不会像另一个答案中所解释的那样得到精确的零,即两个正数的比率不能为零,而且即使解存在,也只能期望解达到数值近似。我实际上编辑了问题,但很快当我这样做的时候,我收到了一个错误。我对
q
的预期解决方案是
q我从你的解释中意识到的另一件事。
q
是一个矩阵,得到它的转置会改变一切。如果它是一个向量,就不会有任何问题。如果你改变问题,那么你需要改变答案来对应。如果f和m是a修改后的问题中的s和q是您评论中显示的矩阵,然后使用多根(函数(q)f(矩阵(q,2),m),q)