2013-06-05 52 views
2

我需要帮助了解如何编码以下问题。任何帮助将不胜感激!具有不同参数的Matlab函数

创建将采取x矢量/阵列输入(1 by n)和a一个标量输入,并产生由下式所定义的输出的函数:

y(x,a)=((xsin(ax-2))/(sqrt(1+(ax)^2) 
-π ≤ x ≤ π 
a={.5 1 1.5 2} 

方程式必须被矢量条款为x,函数的输出为数组y,它与数组x具有相同的尺寸。

编写一个调用此函数的脚本来计算y(x,a),其范围为上面定义的x以及参数a的每个值。对于每个值a,应使用解矩阵的不同行将结果存储在解矩阵中。

到目前为止我的功能,我有:

function [y] = part1(a,x) 
y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2))); 
end 

我不知道我怎么输出这个到解矩阵

对于我的剧本有:

%% 
clear,clc 

a={0.5 1 1.5 2}; 
x=-pi:0.1:pi; 

for 
    part1(x,a) 
end 

我当我现在运行这个时出现以下错误:

Undefined function 'mtimes' for input arguments of type 'cell'. 

Error in part1 (line 4) 
    y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2))); 

Error in labtest2 (line 8) 
    y(i,:)=part1(x,a(i)); 

编辑

我做了一些更改,仍然收到一些我无法解决的错误。

这里其次是完整的代码我的功能完整代码的脚本:

功能

function [y] = part1(x,a) 

nx=numel(x); 
na=numel(a); 

y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2))); 
size(y)=[nx na] 
end 

脚本

%% 
clear,clc 

a={0.5 1 1.5 2}; 
x=-pi:0.1:pi; 

for i = 1:length(a) 
    y(i,:)=part1(x,a(i)); 
end 

错误

Undefined function 'times' for input arguments of type 'cell'. 

Error in part1 (line 6) 
    y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2))); 

Error in labtest2 (line 8) 
    y(i,:)=part1(x,a(i)); 

回答

0

你快那里。需要注意的是你写

function [y] = part1(a,x) 

,但你把它在你的脚本

part1(x,a) 

所以你应该纠正。

有几件事情我跳出:

  • 你永远的part1(x,a)输出分配给什么。你被告知

    结果应使用不同的列解矩阵的每个值存储在解矩阵。

我认为这意味着第一行对应 part1()a的第一个元素进行了评估。由于我们正在使用 x这是一个向量,该行将有多个列。你的输出确实是一个矩阵。在你的情况下, length(-pi:0.1:pi) == 63,因此 size(y) == [4 63],其中 y是你的输出矩阵。

  • for循环是倒退。你被告知接受标量a和向量​​x。因此,您的脚本应该是这样的:

    a = 0.5:0.5:2; 
    x = -pi:0.1:pi; 
    for i = 1:length(a) 
        y(i,:) = part1(x, a(i)); 
    end 
    

注意使用length:运营商。我想迭代1到length(a)(在这种情况下,length(a) == 4),以便我可以使用当前的a(i)值作为我的输出矩阵y的索引。 y(i,:)中的:运算符表示“i th行”和“全部列”y“将采用part1(x,a(i))输出的值。”

  • 您的功能需要更改为element-by-element operations。请注意,例如,x*sin(a*x-2)适用于标量x,但不适用于矢量。这是因为x是一个向量,而sin(a*x-2)也是一个向量(因为sin调用将逐个元素操作,而a是一个标量)。试图将两个向量相乘会导致错误,因为MATLAB会尝试执行乘法运算。用.*代替*解决此问题。用这种方法,你要明确地将这两个向量乘以一个元素。您还需要将/更改为./

在另一方面,谢谢你试图询问SO帮助前要做好功课。我们已经收到了大量来自学生的问题,他们没有尝试在将它们倾倒在我们身上之前做自己的工作,所以令人耳目一新的是,我们的MATLAB标签的常客得到了实际的帮助,而不是告诉人们做他们自己的工作自己的工作。

+0

好吧,我搞掂代码中的一些错误,并让你建议的修改,但我仍然有两个问题 1.如何分配输出第一部分的解决方案矩阵? 2.我的代码目前看起来像这样: a = {0.5 1 1.5 2}; x = -pi:0.1:pi;对于i = 1:长度(a) y(i,:)= part1(x,a(i)); 结束 我在这里得到一个错误,指出“labtest2(第8行) y(i,:)= part1(x,a(i))中的错误;” –

+0

猜我不能在代码中添加代码... 我正在用新的问题/错误更新原始问题 –

+0

我刚刚检查了你的函数 - 你需要使用逐个元素的乘法。看到我的编辑,马上就来。 –

2

你得到的原因Undefined function 'times' for input arguments of type 'cell'是因为你的变量a是一个单元格数组。您需要将您的a分配从

a={0.5 1 1.5 2}; 

改变

a=[0.5 1 1.5 2]; 

这将使得它只是一个正常的阵列。或者,您需要使用单元格数组表示法来引用它:a{i}而不是a(i)

0

终于搞定了整个事情。

功能

function [y] = part1(x,a) 

    y=((x.*sin(a.*x - 2))./(sqrt(1 + (a.*x).^2))); 

end 

脚本

%% 
clear all; 
clc; 
close all; 

x=[-pi:.1:pi]; 
a=[.5:.5:2]; 

for i=1:length(a) 
    y(i,:)=part1(x,a(i)); 

    plot(x,y) 
end 

Sol=[y] 
+0

你不需要像''''''''''''''''''''''''''''' '-pi:.1:pi'已经是一个向量,例如。事实上,有时候这样做是件坏事。 [链接到相关的MATLAB Answers讨论](http://www.mathworks.com/matlabcentral/answers/35676-why-not-use-square-brackets) –