Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用fzero在MatLab中求解方程_Matlab - Fatal编程技术网

用fzero在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; 然后,我尝试通过键入以下内容来查找第一个方程的零,结果出

我希望这是正确的领域。我正试图让这段代码在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此语句不正确 在任何函数中。(它紧跟着终止 函数“测试”的定义

新错误

使用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)