使用fzero解决MatLab中的eqn

时间:2015-12-18 09:07:28

标签: 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;

然后我通过输入这个来尝试找到第一个等式的零,我得到错误:

solution=fzero(@test,5000000)

我收到以下错误:

  

错误:文件:test.m行:5列:1此语句不是   在任何功能内。 (它跟随END终止了   函数的定义" test"。)

新错误

  

使用fzero时出错(第289行)   FZERO无法继续,因为用户提供的function_handle ==> @(X)   (测试(X,B,B,A,R,P))   因以下错误而失败。

     

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

2 个答案:

答案 0 :(得分:1)

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

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)

顺便说一下,除非你确实意味着矩阵乘法,否则我建议你用{-1}}中的*/替换所有{@ 1}}和test的元素运算符{{ 1}}和.*。如果你正在处理标量,现在没关系,但如果你以后想要扩展你的项目并需要一个矢量化的解决方案,它会产生很大的不同。

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

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

答案 1 :(得分:0)

你的

scala> count2002to2011.keys // all artists within the time period
res0: Iterable[String] = Set(Sue, Joe, Tom)

scala> count2002to2011.values.sum // total count within the time period
res1: Int = 6

scala> count2002to2011("Sue") // count for just this artist
res2: Int = 4

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

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

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