MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   MATLAB论坛 (https://www.labfans.com/bbs/forumdisplay.php?f=6)
-   -   [求助]求解一个化不开的函数的作图 (https://www.labfans.com/bbs/showthread.php?t=3698)

OKboy 2008-06-23 16:22

[求助]求解一个化不开的函数的作图
 
请高手指教一下这个图怎么画:
tanh(pi/0.65*w*sqrt(k^2-1))=1/(17.36-0.715i)*sqrt(k^2+17.36-0.715i)/sqrt(k^2-1)

我想作横坐标为w=0:100,纵坐标分别为k的实部和虚部,估计Real范围在0:12;Imag范围在0:0.4,我刚学Matlab不久,只会一般的画图,但是这个函数我化不开那个在双曲线和根号里的k值,请高手看看怎么解决,谢谢:lovely:

fanxing39 2008-06-23 17:56

[SIZE="4"]竟然是个 隐函数,并且还是个复变函数的[/SIZE] :lovely:
怎么什么事情都让你赶上了

watcher 2008-06-23 21:11

个人建议,直接离散化w,用for循环对每个w求解方程(solve()),最后应该得到与每个w对应的k序列,然后分列实部(real())虚部(imag()),分别绘图。
这样做虽然比较笨,但是应该可以解决问题,只是要注意,for循环变量不要用i、j,否则会与虚数(-1)^(1/2)冲突。

OKboy 2008-06-23 22:50

[QUOTE=watcher;13052]个人建议,直接离散化w,用for循环对每个w求解方程(solve()),最后应该得到与每个w对应的k序列,然后分列实部(real())虚部(imag()),分别绘图。
这样做虽然比较笨,但是应该可以解决问题,只是要注意,for循环变量不要用i、j,否则会与虚数(-1)^(1/2)冲突。[/QUOTE]

请问可不可以直接帮我编一个出来,我自己水平有限,一直不能汇出这个图,假如我只算w=10情况下的k,那怎么算呢:lovely:

watcher 2008-06-24 00:38

文件名:f1.m
内容:
function F=f1(k,w)
F=tanh(pi/0.65*w*sqrt(k^2-1))-1/(17.36-0.715*i)*sqrt(k^2+17.36-0.715*i)/sqrt(k^2-1);
---------------------------------------------------------
文件名:*.m
内容:
clear all;
w=0:0.1:100;%这里设了步长0.1,可自行调节
for n=1:size(w,2)
k(n)=fsolve(@(k)f1(k,w(n)),6,optimset('Display','off','TolFun',1e-6));%用了fsolve,实际上是当作优化问题处理了
end
kr=real(k);
ki=imag(k);
subplot(1,2,1);%左边的画实部
plot(w,kr);
subplot(1,2,2);%右边的画虚部
plot(w,ki);
---------------------------------------------------------
ps:获得的图形很奇特,不连续,如果w代表频率,想不出k代表什么。
LZ可以用命令
tanh(pi/0.65*w.*sqrt(k.^2-1))-1./(17.36-0.715*i).*sqrt(k.^2+17.36-0.715*i)./sqrt(k.^2-1);
验证计算结果

fgabertb 2008-06-24 01:27

[QUOTE=fanxing39;13041][SIZE="4"]竟然是个 隐函数,并且还是个复变函数的[/SIZE] :lovely:
怎么什么事情都让你赶上了[/QUOTE]

請使用 ezplot函數 此函數可以直接針對隱函數畫圖

ezplot('tanh(pi/0.65*w*sqrt(k^2-1))=1/(17.36-0.715i)*sqrt(k^2+17.36-0.715i)/sqrt(k^2-1)')
:smile:

OKboy 2008-06-24 03:46

:biggrin: [QUOTE=watcher;13059]文件名:f1.m
内容:
function F=f1(k,w)
F=tanh(pi/0.65*w*sqrt(k^2-1))-1/(17.36-0.715*i)*sqrt(k^2+17.36-0.715*i)/sqrt(k^2-1);
-----------------------------...[/QUOTE]

Thank you ,已经解决了,你的方法是正确的,至于图像离奇是因为我看漏了w的单位,应该设为w=0:0.001:0.1,修改后得到我想要的图了,:biggrin:

OKboy 2008-06-24 03:55

[QUOTE=watcher;13059]文件名:f1.m
内容:
function F=f1(k,w)
F=tanh(pi/0.65*w*sqrt(k^2-1))-1/(17.36-0.715*i)*sqrt(k^2+17.36-0.715*i)/sqrt(k^2-1);
-----------------------------...[/QUOTE]

还有一个问题,如果我用双纵轴画图,怎么修改另外一条纵轴的scale和label呢?
clear all;
w=0:0.001:0.1;%这里设了步长0.001,可自行调节
for n=1:size(w,2)
k(n)=fsolve(@(k)f1(k,w(n)),6,optimset('Display','off','TolFun',1e-6));%用了fsolve,实际上是当作优化问题处理了
end
kr=real(k);
ki=imag(k);
plotyy(w,kr,w,ki);
axis([0,0.1,0,12[COLOR="Red"][COLOR="red"],]);%另外一条纵轴ki我想设为scale为0:0.4,并加上标题[/COLOR][/COLOR]

OKboy 2008-06-24 16:12

自己解决了,例如可以用以下实现:
x=0:pi/50:pi;
y1=sin(x);
y2=cos(x);
ax=plotyy(x,y1,x,y2);
%%%%%% 新加程序%%%%%%%%
ylim(ax(2),[-2 2])
ylabel(ax(2),'Y2 axis')


以下是matlab自带的例子,同样可以解决问题

>> x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');
>> set(get(AX(1),'Ylabel'),'String','Slow Decay')
set(get(AX(2),'Ylabel'),'String','Fast Decay')
>> xlabel('Time (\musec)')
title('Multiple Decay Rates')
>> set(H1,'LineStyle','--')
set(H2,'LineStyle',':')


希望这个帖子对大家有用拉:smile:

watcher 2008-06-24 22:03

[QUOTE=fgabertb;13060]請使用 ezplot函數 此函數可以直接針對隱函數畫圖

ezplot('tanh(pi/0.65*w*sqrt(k^2-1))=1/(17.36-0.715i)*sqrt(k^2+17.36-0.715i)/sqrt(k^2-1)')
:smile:[/QUOTE]

不错的方法,不过不区分实部、虚部?


所有时间均为北京时间。现在的时间是 19:46

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.