首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用optim()求解方程

使用optim()求解方程
EN

Stack Overflow用户
提问于 2019-05-28 10:00:44
回答 2查看 332关注 0票数 0

我有两个方程需要使用optim解决

代码语言:javascript
运行
复制
{(4x^2-20x+1/4 y^2+8=0
  1/2 xy^2+2x-5y+8=0)

我已经运行了代码,但是我不知道应该有1个答案还是2个答案,因为函数只返回最后一行的结果

我应该这样做吗?

代码语言:javascript
运行
复制
> myfunc=function(x){
+  4*x[1]^2-20*x[1]+(x[2]^2/4)+8
+  }
> optim(c(0,0),myfunc,method="BFGS")

代码语言:javascript
运行
复制
>  myfunc=function(x){
+  (1/2)*(x[1]*x[2]^2)+2*x[1]-5*x[2]+8
+  }
> optim(c(0,0),myfunc,method="BFGS")

或者我应该这样做

代码语言:javascript
运行
复制
> myfunc=function(x){
+  4*x[1]^2-20*x[1]+(x[2]^2/4)+8
+  (1/2)*(x[1]*x[2]^2)+2*x[1]-5*x[2]+8
+  }
> optim(c(0,0),myfunc,method="BFGS")

对于第二个函数,它仍然只给出第二个函数的答案,所以哪种方法是正确的。

EN

回答 2

Stack Overflow用户

发布于 2019-05-28 10:12:04

最小化应等于零的两个表达式的平方和,并确保最佳值等于0(直到浮点近似)。

代码语言:javascript
运行
复制
myfunc <- function(z) {
  x <- z[1]
  y <- z[2]
  (4*x^2-20* x + 1/4*y^2 + 8)^2 + (1/2 * x*y^2 + 2*x- 5*y + 8)^2
}
optim(c(0, 0), myfunc)

给予:

代码语言:javascript
运行
复制
$par
[1] 0.5000553 2.0002986

$value
[1] 1.291233e-06

$counts
function gradient 
      67       NA 

$convergence
[1] 0

$message
NULL
票数 1
EN

Stack Overflow用户

发布于 2019-05-28 13:34:32

您还可以使用软件包来求解非线性方程组,如nleqslv

稍微重新定义函数,使其返回一个包含每个方程结果的向量

代码语言:javascript
运行
复制
myfunc <- function(x){
    y <- numeric(length(x))
    y[1] <- 4*x[1]^2-20*x[1]+(x[2]^2/4)+8
    y[2] <- (1/2)*(x[1]*x[2]^2)+2*x[1]-5*x[2]+8
    y
}

定义求解程序的起始值

代码语言:javascript
运行
复制
xstart <- c(0,0)  

然后这样做

代码语言:javascript
运行
复制
library(nleqslv)
nleqslv(xstart,myfunc)

给予

代码语言:javascript
运行
复制
$x
[1] 0.5 2.0

$fvec
[1] -1.472252e-09 -7.081979e-10

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 7

$njcnt
[1] 1

$iter
[1] 7

有更多的软件包可以解决方程系统,如BBpracma

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56334158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档