Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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
Function matlab函数,它是一个积分函数_Function_Matlab - Fatal编程技术网

Function matlab函数,它是一个积分函数

Function matlab函数,它是一个积分函数,function,matlab,Function,Matlab,我需要编写自己的函数,其形式为fx,y=Integrategx,y,z,z,从0到inf。因此,我使用的代码是: function y=f(x,y) g=@(z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z y=quadgk(g,0,inf) 如果我用fx0,y0这样的单个值来调用它,它是有效的,但是如果我试图计算f[1:10],y0这样的值,那么错误信息表明时间和维度有问题。原则上,我可以使用for循环

我需要编写自己的函数,其形式为fx,y=Integrategx,y,z,z,从0到inf。因此,我使用的代码是:

function y=f(x,y)
g=@(z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z
y=quadgk(g,0,inf)
如果我用fx0,y0这样的单个值来调用它,它是有效的,但是如果我试图计算f[1:10],y0这样的值,那么错误信息表明时间和维度有问题。原则上,我可以使用for循环,但是我的代码会慢下来,而且会花费很长时间。你们能帮我什么忙吗?还是推荐信

我试图避免for循环,因为在matlab中,使用矩阵计算比使用for循环快得多。我想知道是否有任何技巧,我可以利用这一特点

谢谢你事先的帮助


Lynn

也许您可以尝试转换间隔,创建基于行的值,而不是基于列的f[1:10]',y0。否则,函数中的某些内容可能会出错,例如,要使x^y使用列表作为输入,必须使用点x作为前缀。^y。我认为多重和除法也是如此。

也许您可以尝试转换间隔,创建基于行的值,而不是基于列的f[1:10]',y0。否则,函数中的某些内容可能会出错,例如,要使x^y使用列表作为输入,必须使用点x作为前缀。^y。我认为对于多重和除法也是如此。

如果循环对您来说没有问题,您应该执行以下操作:

function y2=f(x,y)
y2=zeros(size(x));

for n=1:numel(x)
  g=@(z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z
  y2(n)=quadgk(g,0,inf)
end

如果循环对您来说没有问题,您应该执行以下操作:

function y2=f(x,y)
y2=zeros(size(x));

for n=1:numel(x)
  g=@(z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z
  y2(n)=quadgk(g,0,inf)
end
这里的问题是quadk本身使用向量作为g的参数。然后在g中有一些类似z.^x的东西,这是两个向量的幂,只有当z和x的维数相同时才定义。但这不是你想要的

我假设您希望为x中的所有参数计算函数,并且输出向量的维数与x相同。但这似乎是不可能的,因为即使是这个简单的例子

g=@(x)[x;x.^2]
quad(g,0,1)
不起作用:

Error using quad (line 79)
The integrand function must return an output vector of the same length as the
input vector.
使用quadgk时会出现类似的错误。文件还指出,该例程仅适用于标量函数,这并不奇怪,因为自适应求积规则通常会对每个函数使用不同的点来计算积分

必须使用quadvinstead,它可以积分向量值函数。但这会给出错误的结果,因为函数是在区间[0]中积分的。

这里的问题是quadk本身使用向量作为g的参数。然后在g中有一些类似z.^x的东西,这是两个向量的幂,只有当z和x具有相同的维数时才定义。但这不是你想要的

我假设您希望为x中的所有参数计算函数,并且输出向量的维数与x相同。但是这似乎不可能,因为即使是这个简单的示例

g=@(x)[x;x.^2]
quad(g,0,1)
不起作用:

Error using quad (line 79)
The integrand function must return an output vector of the same length as the
input vector.
使用quadgk时也会出现类似的错误。文档还指出,该例程仅适用于标量函数,这并不奇怪,因为自适应求积规则通常会对每个函数使用不同的点来计算积分


必须使用quadvinstead,它可以对向量值函数进行积分,但这会给出错误的结果,因为函数是在区间内积分的[0,\infty.

非常感谢您的回答,我尝试了行和列向量,并确保在每个*和^and/(和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和/和在你的例子中,我认为你应该使用一个for循环。如果你的x=1:10,我想它不会超过正常函数的十倍。如果我使用for循环十次,这不是问题,但是我需要将这个函数传递给另一个函数来做一些优化,为了做到这一点这个f函数必须能够接受向量输入并产生向量输出…在你的例子中,我认为你应该使用一个for循环。如果你的x=1:10,我想它所用的时间不会超过正常函数的十倍。如果我使用for循环十次,这不是一个问题,但是我需要将这个函数传递给另一个函数为了做一些优化,为了做到这一点,f函数必须能够接受向量输入并产生向量输出…非常感谢你的回复,我尝试了for循环,但之后我需要永远运行我的整个代码。这个函数只是我项目的一部分。在我定义了这个函数之后,我需要执行一个反向Lapla因此,如果我每次使用for循环,代码就会太慢,因为对于matlab来说,执行矩阵计算要比for循环快得多,只希望有一些技巧可以做到。无论如何,非常感谢。非常感谢你的回复,我确实尝试了for l 哦,但是我需要永远运行我的全部代码。这个功能只是我项目的一部分。定义此函数后,我需要对其执行逆拉普拉斯运算,然后最大化结果函数…因此,如果每次使用for循环,代码将太慢,因为对于matlab,执行矩阵计算比for循环快得多,只希望有一些技巧可以做到这一点。无论如何,非常感谢。