【问题标题】:Using fzero to solve eqn in MatLab在 MatLab 中使用 fzero 求解方程
【发布时间】:2015-12-18 09:07:28
【问题描述】:

我希望这是正确的区域。我正在尝试让这段代码在 MatLab 中工作。

function y=test(x)
    y=-x+(B/(B-1))*(r-a)*p+(B/(B-1))*(r-a)*(b((1-(b/x)^(B-1))/r-  a)+p* ((b/x)^B))/(1-(b/x)^B);
end

然后我跳转到命令值并输入:

B=3.0515;
b=1.18632*10^5;
a=.017;
r=.054;
p=5931617;

然后我尝试通过键入以下内容来查找第一个等式的零点,但出现错误:

solution=fzero(@test,5000000)

我收到以下错误:

错误:文件:test.m 行:5 列:1 此语句不是 在任何函数中。 (它跟随着 END 终止 函数“test”的定义。)

新错误

使用 fzero 时出错(第 289 行) FZERO 无法继续,因为用户提供了 function_handle ==> @(x) (测试(x,B,b,a,r,p)) 失败并出现以下错误。

下标索引必须是正整数或逻辑数。

【问题讨论】:

  • 欢迎来到 SO,请编辑您的问题以包含您收到的逐字错误消息。始终包括您在问题中遇到的确切错误。而且,如果您在命令行中定义Bba 等,它们在您的函数test 中将没有作用域。所以就test 而言,它们基本上是未定义的。

标签: matlab


【解决方案1】:

我猜这是scoping 的问题,您在命令行中定义变量(Bb 等...),但尝试在test 函数中使用它们它们超出了范围。您应该更改您的测试函数以将这些作为参数,然后使用anonymous function,这样您在fsolve 中对test 的调用仍然只需要一个参数:

function y=test(x, B, b, r, a, p)
    y=-x+(B/(B-1))*(r-a)*p+(B/(B-1))*(r-a)*(b((1-(b/x)^(B-1))/r-  a)+p* ((b/x)^B))/(1-(b/x)^B);
end

B=3.0515;
b=1.18632*10^5;
a=.017;
r=.054;
p=5931617;

solution=fzero(@(x)(test(x,B,b,a,r,p)),5000000)

顺便说一句,除非您真的是指矩阵乘法,否则我建议您将test 中的所有*s 和/s 替换为逐元素运算符.*./。如果您正在处理标量,现在没关系,但如果您以后想要扩展您的项目并需要矢量化解决方案,这将产生很大的不同。

关于您添加到问题中的错误:

  1. 您不能将代码放在函数文件中的end 之后。 (局部函数除外)。您的目标函数应该是一个 .m 文件,其中包含一个函数的代码。
  2. 这是因为在您的测试函数中有...b((1-(b/x)^(B-1))...,这在MATLAB 中意味着您正在尝试索引变量b,在这种情况下(1-(b/x)^(B-1) 的值必须是一个正整数。我猜你错过了*

【讨论】:

  • 您能解释一下为什么我在原始帖子中收到上述错误吗?
  • @MSanders 错误很清楚,您已将代码放在函数文件中函数的 end 之后。在 MATLAB 中,您不允许这样做。您的 test 函数应该是它自己的 .m 文件中与函数同名的唯一代码。
  • 谢谢丹。现在收到此错误Error using fzero (line 289) FZERO cannot continue because user supplied function_handle ==> @(x)(test(x,B,b,a,r,p)) failed with the error below. Subscript indices must either be real positive integers or logicals.
  • @MSanders 这是因为在您的 test 函数中您有 ...b((1-(b/x)^(B-1))... 在 MATLAB 中这意味着您正在尝试索引变量 b 在这种情况下 (1-(b/x)^(B-1) 的值必须是一个正整数。我猜你错过了*
  • @MSanders 没问题,如果这解决了你的问题,那么你应该考虑accepting it
【解决方案2】:

你的

function y=test(x)
    y=-x+(B/(B-1))*(r-a)*p+(B/(B-1))*(r-a)*(b((1-(b/x)^(B-1))/r-  a)+p* ((b/x)^B))/(1-(b/x)^B);
end

无法访问工作区中的变量。您需要以某种方式传递值。你可以这样做:

function y=test(x,B,b,a,r,p)
    y=-x+(B/(B-1))*(r-a)*p+(B/(B-1))*(r-a)*(b((1-(b/x)^(B-1))/r-  a)+p* ((b/x)^B))/(1-(b/x)^B);
end

然后你可以创建一个隐式包装函数:

B=3.0515;
b=1.18632*10^5;
a=.017;
r=.054;
p=5931617;
solution = fzero(@(x) test(x,B,b,a,r,p),5000000)

我没有测试 fzero 是否返回合理的结果,但是这段代码应该不会出错。

【讨论】:

  • 我运行了大家建议的代码,得到以下错误Error: File: test.m Line: 5 Column: 1This statement is not inside any function.(It follows the END that terminates the definition of the function "test".)
  • 你需要做一些关于如何在 Matlab 中编写函数的教程。 mathworks.com/help/matlab/programming-and-data-types.html我猜你在脚本文件中定义了一个函数,它需要在它自己的单独文件中。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多