X y z and c cannot be complex ошибка

4 / 4 / 1

Регистрация: 02.11.2013

Сообщений: 164

1

03.11.2015, 16:53. Показов 4133. Ответов 2


Студворк — интернет-сервис помощи студентам

При выполнении программы матлаб выдает ошибку:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[x,y]=meshgrid([-3:0.5:5]);
z=x.*sqrt(y)-x.^2;
subplot(2, 2, 1),  plot3(x, y, z);
grid on 
xlabel('x');
ylabel('y');
zlabel('z');
title('plot3(x, y, z)');
subplot(2, 2, 2), mesh(x, y, z);
grid on
xlabel('x');
ylabel('y');
zlabel('z');
title('mesh(x, y, z)');
subplot(2, 2, 3),    surf(x, y, z);
grid on
xlabel('x');
ylabel('y');
zlabel('z');
title('surf(x, y, z)');

Trial>> Untitled4
Warning: Imaginary parts of complex X, Y, and/or Z arguments ignored
> In Untitled4 (line 4)
Error using mesh (line 70)
X, Y, Z, and C cannot be complex.

Error in Untitled4 (line 10)
subplot(2, 2, 2), mesh(x, y, z);

Почему x, y и z считаются комплексными, и как это исправить?



0



vetri veeran

  • Direct link to this question

 ⋮ 

  • Direct link to this question

Hi all,

I want to draw 3D plot using surf command for vt = 0, -0.1…-0.5

I am getting an error as,

Error using surf X,Y, Z and C cannot be complex

My code is given below,

B = 1e-4; sigma_on = 0.45; x_on = 0.06; sigma_p = 4e-5; A = 1e-10; sigma_off = 0.013; x_off = 0.4; G_m = 0.025; rho = 1e-3; v_m = -0.5;

vt= 0:0.1:0.5;

t = 0.01:0.01:1;

for v = 1:length(vt)

v_m = -vt(v);

for x = 1:length(t)

G(x) = G_m*t(x)+ exp(sqrt(v_m));

f1(x) = A*sinh(v_m/sigma_off)*exp(-(x_off^2/t(x)^2));

f2(x) = B*sinh(v_m/sigma_on)*exp(-(t(x)^2/x_on^2));

f(x) = f1(x) + f2(x);

final(v,x)=log(f(x));

end

end;

surf(t,vt,final);

Can anyone help me.

Accepted Answer

Jan

  • Direct link to this answer

 ⋮ 

  • Direct link to this answer

The error message is clear: «X,Y, Z and C cannot be complex». Obviously there are complex values. All we see is the failing code, but we cannot guess reliably, what its intention is. Therefore it is hard (or random) to suggest an improvement.

Maybe you want:

surf(t, vt, real(final));

or

or your calculations are wrong.

[SL: fixed typo in last code segment.]


More Answers (2)

Star Strider

  • Direct link to this answer

 ⋮ 

  • Direct link to this answer

The logarithm of a negative number will be complex. There are several ways to avoid that, the easiest being:

final(v,x)=log(abs(f(x)));

Note that the logarithm of 0 is -Inf, so you may want to trap ‘f(x)’ to prevent it from being zero as well. The easiest way to do that would be to have it equal NaN if it is zero, because NaN values will not plot. Consider setting the negative values of ‘f(x)’ to NaN as well, as one option.


vetri veeran

  • Direct link to this answer

 ⋮ 

  • Direct link to this answer

Thank you very much Jan Simon and Star Strider for your answer

See Also

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

An Error Occurred

Unable to complete the action because of changes made to the page. Reload the page to see its updated state.

MathWorks - Domain Selector

I’m trying to plot Ackley Function in matlab But I’m getting the following error

Error using surf (line xxx)

X, Y, Z, and C cannot be complex.

Here’s the code I’m using

clear; clc; close all;
% Parameters
nx = 2;                 % No. of Input variables
f = @ackley;
limits = repmat([-40 40], nx, 1);
titl = 'Ackley';

% Plot
[X,Y] = meshgrid(linspace(limits(1,1),limits(1,2),100),...
                     linspace(limits(2,1),limits(2,2),100));
Z = reshape(f([X(:)'; Y(:)']), 100, 100);

surfc(X,Y,Z);

Ackley.m

function [y] = ackley(x)
    d = length(x);
    a = 20;
    b = 0.2;
    c = 2*pi;

    term1 = -a * exp(-b*sqrt(1/d * sum(x)));
    term2 = -exp(1/d * sum(cos(c * x)));

    y = term1 + term2 + a + exp(1);
end

slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Графики

Доброго времени суток.

Подскажите пожалуйста, при построенииее графиков в функции что обозначают точки, и где их ставить,а где нет? В своём учебнике не нашёл :(

>> [x,y]=meshgrid(-7:0.01:7);

z=(x.^2+y.^2)*acos((y.^2+8*y+4)/100)^3;

mesh(x,y,z)

surf (x,y,z); grid on; colormap;

contour(x,y,z,20); colorbar; grid on


amandra

Пользователь
Сообщения: 582
Зарегистрирован: Вт мар 28, 2006 4:29 pm

Сообщение amandra » Вт янв 04, 2011 12:26 am

с точкой — поэлементное вычисление

сравните результат

Донесем чистоту до трудно доступных мест — ни дня без туалетной бумаги


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Вт янв 04, 2011 12:49 am

amandra писал(а):с точкой — поэлементное вычисление
сравните результат

Сравнил.

B =

7 10

15 22

>> A=[1 2;3 4];

D=A.^2

D =

1 4

9 16

Результат В получили обычным умножением, а D просто возводя каждый элемент в квадрат, так получается?

Если у меня задана функция z=(x^2+y^2)*acos((y^2+8*y+4)/100)^ где мне расставить точки чтобы получить верный результат? Всё равно принципа не понял (


amandra

Пользователь
Сообщения: 582
Зарегистрирован: Вт мар 28, 2006 4:29 pm

Сообщение amandra » Вт янв 04, 2011 12:59 am

z=(x.^2+y.^2)*acos((y.^2+8.*y+4)/100)^3;

Донесем чистоту до трудно доступных мест — ни дня без туалетной бумаги


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Вт янв 04, 2011 1:16 am

amandra писал(а):

z=(x.^2+y.^2)*acos((y.^2+8.*y+4)/100)^3;

Неа (

>> [x,y]=meshgrid(-7:0.01:7);

z=(x.^2+y.^2)*acos((y.^2+8.*y+4)/100)^3;

mesh(x,y,z)

surf (x,y,z); grid on; colormap;

contour(x,y,z,20); colorbar; grid on

??? Error using ==> surface

X, Y, Z, and C cannot be complex.


amandra

Пользователь
Сообщения: 582
Зарегистрирован: Вт мар 28, 2006 4:29 pm

Сообщение amandra » Вт янв 04, 2011 1:49 am

Код: Выделить всё

[x,y]=meshgrid(-7:0.01:7);
z=(x.^2+y.^2).*acos((y.^2+8.*y+4)/100)^3;
mesh(x,y,z)
surf (x,y,z); grid on; colormap;
contour(x,y,z,20); colorbar; grid on

Донесем чистоту до трудно доступных мест — ни дня без туалетной бумаги


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Вт янв 04, 2011 7:33 am

неа, опять таже ошибка


amandra

Пользователь
Сообщения: 582
Зарегистрирован: Вт мар 28, 2006 4:29 pm

Сообщение amandra » Вт янв 04, 2011 9:03 am

давайте по порядку

1) у вас только этот код и больше ничего нет?

2) только этот код запустите

Код: Выделить всё

[x,y]=meshgrid(-7:0.01:7);
z=(x.^2+y.^2).*acos((y.^2+8.*y+4)/100)^3;
mesh(x,y,z)

Донесем чистоту до трудно доступных мест — ни дня без туалетной бумаги


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Вт янв 04, 2011 9:13 am

[x,y]=meshgrid(-7:0.01:7);

z=(x.^2+y.^2).*acos((y.^2+8.*y+4)/100)^3;

mesh(x,y,z)

Этот код выдаёт:

>> [x,y]=meshgrid(-7:0.01:7);

z=(x.^2+y.^2).*acos((y.^2+8.*y+4)/100)^3;

mesh(x,y,z)

??? Error using ==> surface

X, Y, Z, and C cannot be complex.

Error in ==> C:MATLAB6p5toolboxmatlabgraph3dmesh.m

On line 93 ==> hh = surface(x,y,z,’FaceColor’,fc,’EdgeColor’,’flat’, ‘FaceLighting’, ‘none’, ‘EdgeLighting’, ‘flat’);


U235

Пользователь
Сообщения: 814
Зарегистрирован: Пт июл 01, 2005 10:13 am

Сообщение U235 » Вт янв 04, 2011 12:50 pm

Скорее всего у Вас аргумент аркосинуса больше единицы получается, в результате функция становится комплексной и mesh ее не строит.

И перед кубом точка возможно нужна.


amandra

Пользователь
Сообщения: 582
Зарегистрирован: Вт мар 28, 2006 4:29 pm

Сообщение amandra » Вт янв 04, 2011 1:09 pm

U235 писал(а):Скорее всего у Вас аргумент аркосинуса больше единицы получается, в результате функция становится комплексной и mesh ее не строит.
И перед кубом точка возможно нужна.

так у меня работает, это у slimkin не выходит…

Донесем чистоту до трудно доступных мест — ни дня без туалетной бумаги


abobroff

Пользователь
Сообщения: 488
Зарегистрирован: Пн окт 25, 2010 1:21 pm

Сообщение abobroff » Вт янв 04, 2011 1:36 pm

amandra писал(а):…так у меня работает…

Я полностью согласен с U235.

Код: Выделить всё

>> y=7;acos((y.^2+8.*y+4)/100)
ans =
        0 + 0.4211i


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Ср янв 05, 2011 1:45 am

U235, спасибо, скорей всего так и есть, изменил пределы и уже строит)

Но появился другой вопрос, почему surf график строит сплошным чёрным? В настройках чего?

mesh строит этот же как и положено…

>> [x,y]=meshgrid(-6:0.01:6);

z=(x.^2+y.^2)*acos((y.^2+8*y+4)/100)^3;

surf(x,y,z); grid on; colormap;

Изображение


U235

Пользователь
Сообщения: 814
Зарегистрирован: Пт июл 01, 2005 10:13 am

Сообщение U235 » Ср янв 05, 2011 6:27 am

У Вас сетка очень плотная или увеличте шаг, или Line — ‘none’ сделайте.


slimkin

Пользователь
Сообщения: 7
Зарегистрирован: Пн янв 03, 2011 7:24 pm

Сообщение slimkin » Ср янв 05, 2011 7:02 am

О, всё красиво теперь. Спасибо!


I’m trying to plot Ackley Function in matlab But I’m getting the following error

Error using surf (line xxx)

X, Y, Z, and C cannot be complex.

Here’s the code I’m using

clear; clc; close all;
% Parameters
nx = 2;                 % No. of Input variables
f = @ackley;
limits = repmat([-40 40], nx, 1);
titl = 'Ackley';

% Plot
[X,Y] = meshgrid(linspace(limits(1,1),limits(1,2),100),...
                     linspace(limits(2,1),limits(2,2),100));
Z = reshape(f([X(:)'; Y(:)']), 100, 100);

surfc(X,Y,Z);

Ackley.m

function [y] = ackley(x)
    d = length(x);
    a = 20;
    b = 0.2;
    c = 2*pi;

    term1 = -a * exp(-b*sqrt(1/d * sum(x)));
    term2 = -exp(1/d * sum(cos(c * x)));

    y = term1 + term2 + a + exp(1);
end

Понравилась статья? Поделить с друзьями:
  • X trail ошибка 4wd что это
  • X trail загорелись все ошибки
  • X terra 505 ошибка ce
  • Wudfusbcciddrv ошибка 11 windows 10
  • Wudfrd sys windows 7 исправить ошибку