2013-11-26 16 views
0

Я пытаюсь вычислить потенциальную функцию в заданной копланарной прямоугольной структуре. Здесь уравнение я вывел с помощью математики, вот sumary: Assumption3D-график в Matlab - неверно

Теперь я пытаюсь построить его в MATLAB, вот мой код:

function [x,y,v] = potentialFM(a1,a2,a3,b) 
syms n; 

%range in normalized values 
x=0:1/20:1; 
y=0:(b/a3)/20:(b/a3); 
[X,Y] = meshgrid(x,y); 

%normalized values 
an1=a1/a3; 
an2=a2/a3; 
bn=b/a3; 

%symbol k 
k=(n.*2+1)*(pi/2); 

C1=(1/(k.^2)).*(2/(an1-an2)); 
C2=cos(k.*an2)-cos(k.*an1); 
C3=1/(sinh(k.*bn)); 
Vx=cos(X*k); 
Vy=sinh(Y*k); 
v=symsum(C1.*C2.*C3.*Vx.*Vy,n,1,20); 
end 

Так, Может кто-то есть попытаться мой код и проверить, где ошибка. Результат должен выглядеть как предполагаемый график в ссылке, но я не могу этого добиться.

С наилучшими пожеланиями,

FRZ

+0

У ошибки есть одна ошибка; согласно связанному изображению, оно должно быть «k = (n. * 2 + 1) * pi/2'. –

ответ

0

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

Вот простое исправление - n теперь просто переменная цикла, k другой обычной переменной, а сумма вычисляется кумулятивно с помощью переменной v:

function [x,y,v] = potentialFM(a1,a2,a3,b) 

%range in normalized values 
x=0:1/20:1; 
y=0:(b/a3)/20:(b/a3); 
[X,Y] = meshgrid(x,y); 

%normalized values 
an1=a1/a3; 
an2=a2/a3; 
bn=b/a3; 

v = 0; 
for n = 1 : 20 
    k=(n.*2+1)*(pi/2); 

    C1=(1/(k.^2)).*(2/(an1-an2)); 
    C2=cos(k.*an2)-cos(k.*an1); 
    C3=1/(sinh(k.*bn)); 
    Vx=cos(X*k); 
    Vy=sinh(Y*k); 
    v = v + C1.*C2.*C3.*Vx.*Vy; 
end 

Это не обязательно является наиболее эффективной реализации, может быть, некоторые из вычислений можно было бы векторизовать, но это работает. Выбор произвольно параметров,

[x,y,v] = potentialFM(1, 2, 3, 4); 
surf(x, y, v) 

дает:

surface plot

+0

Привет A. Donda, Благодарим вас за ответ. Я плохо разбираюсь в MATLAB, пытаясь сделать бесконечную сумму, я нашел команду «symsum», которая использует символизированное вычисление. Поэтому я назначаю символы здесь. В моем случае, чтобы построить результат, я также использовал команду «surf», например: surf (x, y, double (v)); дает тот же результат (сюжет), что и ваша программа, но гораздо медленнее. Тем не менее, мой главный вопрос заключается в том, что график кажется не таким похожим, как я ожидал (который находится в ссылке на предположение, которую я приложил). Поэтому я удивляюсь, что здесь есть некоторые ошибки. С уважением, fRz – user3036972

+0

@ user3036972: Так что мое решение не поможет вам, потому что вам нужна бесконечная сумма?Ну, у меня нет большого опыта работы с символическим набором математики, но результат, который вы используете, в исходной форме включает сложные выражения, и я считаю, что они только усложняются для более высокого верхнего предела 'n'. Вы уверены, что ваша серия имеет закрытое решение? –

+0

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

0

Еще одна попытка: Если вам нужно значение бесконечной суммы и надеемся, что symsum может найти закрытую форму выражения, нет необходимости смешать его с числами. Вместо этого, объявлять все переменные как символические:

syms n an1 an2 bn X Y 
k=(n.*2+1)*(pi/2); 
C1=(1/(k.^2)).*(2/(an1-an2)); 
C2=cos(k.*an2)-cos(k.*an1); 
C3=1/(sinh(k.*bn)); 
Vx=cos(X*k); 
Vy=sinh(Y*k); 
v=symsum(C1.*C2.*C3.*Vx.*Vy,n,1,inf); 

symsum возвращает результат, но это выглядит следующим образом:

-(8*sum(((exp(-(pi*X*(2*n + 1)*i)/2)/2 + exp((pi*X*(2*n + 1)*i)/2)/2)*(exp(-(pi*Y*(2*n + 1))/2)/2 - exp((pi*Y*(2*n + 1))/2)/2)*(exp(-(pi*an1*(2*n + 1)*i)/2)/2 + exp((pi*an1*(2*n + 1)*i)/2)/2 - exp(-(pi*an2*(2*n + 1)*i)/2)/2 - exp((pi*an2*(2*n + 1)*i)/2)/2))/((2*n + 1)^2*(exp(-(pi*bn*(2*n + 1))/2)/2 - exp((pi*bn*(2*n + 1))/2)/2)), n == 1..Inf))/(pi^2*(an1 - an2)) 

Как вы можете видеть, Символического Math Toolbox смог выполнить некоторые упрощения (?), но не смогли решить суть проблемы: там все еще есть бесконечная сумма. Насколько я понимаю, это означает, что не существует выражения закрытой формы (или, по крайней мере, это обнаружение выходит за рамки возможностей инструментария).

+0

Уважаемый @Donda, я ценю вашу поддержку. Я думаю, здесь есть кое-какие недоразумения. Могу ли я задать вам вопрос, не взглянул ли вы на мое предположение (ссылка, которую я приложил). Решение находится в рядах Фурье, это означает, что здесь должна быть бесконечная сумма. Но, как мы знаем, бесконечная сумма не нужна (только в теории). поэтому я просто пытаюсь найти «принятый» верхний предел. Дело в том, что когда я выхожу из серии Фурье для моей базы уравнений из предположения, когда я реконструирую свое уравнение (по построению), я ожидал, что сюжет каким-то образом похож на grahp оргинальной функции. – user3036972

+0

Но я не получил никакого успеха в результате заговора. Я не знаком с MATLAB, поэтому я не знаю, ошибочна ли моя выведенная функция или неправильный код. :). Я не думаю, что в моей функции была ошибка :) – user3036972

+0

Да, я посмотрел, но, боюсь, я не совсем понимаю суть этой цели. Для начала функция, показанная там, имеет только один аргумент, х, а не два. Я также не понимаю, почему ряд Фурье такой простой ступенчатой ​​линейной функции будет включать синус гиперболический. –

Смежные вопросы