用fzero在MatLab中求解方程
我希望这是正确的领域。我正试图让这段代码在MatLab中运行用fzero在MatLab中求解方程,matlab,Matlab,我希望这是正确的领域。我正试图让这段代码在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; 然后,我尝试通过键入以下内容来查找第一个方程的零,结果出
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此语句不正确
在任何函数中。(它紧跟着终止
函数“测试”的定义
新错误
使用fzero时出错(第289行)
FZERO无法继续,因为用户提供的函数\u handle==>@(x)
(测试(x,B,B,a,r,p))
失败,错误如下
下标索引必须是实正整数或逻辑数
我想这是一个问题,您在命令行中定义变量(
B
,B
,等等),但试图在test
函数中使用它们,因为它们超出了范围。您应该更改测试函数以将这些作为参数,然后使用,以便对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
及
另一方面,除非你真的表示矩阵乘法,否则我建议你将测试中的所有*
和/
替换为元素运算符*
和/
。如果您现在处理的是标量,这无关紧要,但是如果您以后想要扩展项目并需要矢量化解决方案,这会产生很大的不同
关于您添加到问题中的错误:
在函数文件中,不能将代码放在结束
之后。(本地功能除外)。目标函数应该是一个.m文件,其中包含单个函数的代码
这是因为在测试函数中有…b((1-(b/x)^(b-1))…
,这在MATLAB中意味着您试图索引变量b
,在这种情况下(1-(b/x)^(b-1)
的值必须是正整数。我猜您缺少了*
你的
无法访问工作区中的变量。您需要以某种方式传入值。您可以执行以下操作:
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是否返回合理的结果,但此代码不应给出错误。欢迎这样做,请编辑您的问题以包含您收到的逐字记录错误消息。始终包含您在问题中得到的确切错误。但是,如果您在命令中定义B
,B
,a
等,则结束行,它们在您的函数测试中没有作用域。就测试而言,它们基本上是未定义的。我运行了您建议的代码,得到以下错误错误:File:test.m行:5列:1
此语句不在任何函数中。
(在终止函数“test”定义的结尾之后。)
你需要做一些如何在Matlab中编写函数的教程。我猜你有一个在脚本文件中定义的函数,它需要在它自己的单独文件中。你能解释一下为什么我在原始帖子中出现上述错误吗?@MSanders错误很明显,你已经在f中的函数的结尾
后添加了代码函数文件。在MATLAB中不允许这样做。您的测试函数应该是它自己的.m文件中与函数同名的唯一代码。谢谢Dan。现在使用fzero获得此错误错误(第289行)FZERO无法继续,因为用户提供的函数\u handle==>@(x)(测试(x,B,B,a,r,p))失败,出现以下错误。下标索引必须是实正整数或逻辑数。
@MSanders这是因为在测试函数中有…B((1-(B/x)^(B-1))…在代码中,你试图索引变量<代码> b/COD>。在这种情况下,<代码>(1 -(b/x)^(b-1)< /代码>的值必须是正整数。我猜你缺少了一个<代码> */c> >代码,没问题,如果这解决了你的问题,那么你应该考虑。
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)