PDA

View Full Version : پیدا کردن صفرهای معادلات غیر خطی



ehsan_faal
سه شنبه 15 مهر 1393, 11:36 صبح
سلام،من این معادله رو دارم:

Eq1=@(x) 1+1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j)).^2;
Eq2=@(x) 1-1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j)).^2;

که توی این دو تا معادله داریم:

Omega0=1.32551104310002;

epsilon=0.100503781525921;

هلپ متلب چیزی نداشت که به دردم بخوره،الگوریتم خاصی واسه پیاده سازی تو متلب هست؟
با تشکر

ehsan_faal
سه شنبه 15 مهر 1393, 15:38 عصر
چیزی که خودم تو ذهنمه اینه که با کد زیر جواب بگیرم،ولی جواباش خیلی پرت در میاد

Eq1=@(x) 1+1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j)).^2;
Eq2=@(x) 1-1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j)).^2;


A=linspace(-0.5,0.5,1e3);
B=linspace(-1.5,1.5,1e3);
[NA,NB]=meshgrid(A,B);
Count=1:numel(NA);
xData=complex(NA(Count),NB(Count));
EvalEquation1=Eq1(xData);
EvalEquation2=Eq2(xData);
Telorance=0.01;
SelectionO=find(real(EvalEquation1)<Telorance & imag(EvalEquation1)<Telorance & real(EvalEquation1)>-Telorance & imag(EvalEquation1)>-Telorance);
InputDataO=xData(real(xData(SelectionO))<0);
YO=poly(InputDataO);


SelectionE=find(real(EvalEquation2)<Telorance & imag(EvalEquation2)<Telorance & real(EvalEquation2)>-Telorance & imag(EvalEquation2)>-Telorance);
InputDataE=xData(real(xData(SelectionE))<0);
YE=poly(InputDataE);

rahnema1
سه شنبه 15 مهر 1393, 18:15 عصر
یعنی می خواهید هم قسمت حقیقی صفر باشه و هم قسمت موهومی؟ در این صورت در نقطه x=0 جواب برابر صفر می شه

ehsan_faal
سه شنبه 15 مهر 1393, 18:20 عصر
یعنی می خواهید هم قسمت حقیقی صفر باشه و هم قسمت موهومی؟ در این صورت در نقطه x=0 جواب برابر صفر می شه
طبق مثالی که تو صفحه دوم این مقاله هست دارم جلو میرم.ولی نتایج یکسانی نمیگیرم،لطفا راهنمایی کنید.
http://s5.picofile.com/file/8144646942/A_Novel_Class_of_Generalized_Chebyshev.pdf.html

اینم کدم:


Eq1=@(x) 1+1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j));
Eq2=@(x) 1-1j.*epsilon.*cosh((N-3).*acosh((x./1j).*sqrt((Omega0^2 -1)./(Omega0^2 -(x./1j).^2)))+3.*acosh(x./1j));


A=linspace(-0.5,0.5,5e3);
B=linspace(-1.5,1.5,5e3);
[NA,NB]=meshgrid(A,B);
Count=1:numel(NA);
xData=complex(NA(Count),NB(Count));
EvalEquation1=Eq1(xData);
EvalEquation2=Eq2(xData);
Telorance=0.001;


SelectionO=find(real(EvalEquation1)<Telorance & imag(EvalEquation1)<Telorance & real(EvalEquation1)>-Telorance & imag(EvalEquation1)>-Telorance);
xDataNO=xData(SelectionO);
InputDataO=xDataNO(real(xDataNO)<0);
InputDataO=unique(InputDataO,'stable');
YO=poly(InputDataO);


SelectionE=find(real(EvalEquation2)<Telorance & imag(EvalEquation2)<Telorance & real(EvalEquation2)>-Telorance & imag(EvalEquation2)>-Telorance);
xDataNE=xData(SelectionE);
InputDataE=xDataNE(real(xDataNE)<0);
InputDataE=unique(InputDataE,'stable');
YE=poly(InputDataE);
answer=roots(conv(YE,YO))

rahnema1
چهارشنبه 16 مهر 1393, 16:54 عصر
میتونید بسط تیلور تابع را به دست بیارید تا تبدیل به چندجمله ای بشه که در این صورت ریشه های چندجمله ای با یک دستور به راحتی استخراج میشه

ehsan_faal
چهارشنبه 16 مهر 1393, 17:30 عصر
میتونید بسط تیلور تابع را به دست بیارید تا تبدیل به چندجمله ای بشه که در این صورت ریشه های چندجمله ای با یک دستور به راحتی استخراج میشه

ولی متلب بسط تیلور این تابع رو نمیده بهم.


Error using symengine (line 58)
Cannot compute a Taylor expansion of the input.


Error in sym/taylor (line 133)
tSym = mupadmex('symobj::taylor',f.s,x.s,a.s,options);

rahnema1
چهارشنبه 16 مهر 1393, 21:05 عصر
diبررسی کنید که مقادیر ثابت ها مثل N و غیره را وارد کردید یا نه. البته من در متلب امتحان نکردم ولی اصولا نباید مشکلی باشه

ehsan_faal
چهارشنبه 16 مهر 1393, 21:39 عصر
همه داده ها رو اول برنامه میگیره،ولی نمیدونم این ارور به خاطر چیه!

rahnema1
چهارشنبه 16 مهر 1393, 21:44 عصر
ببینید یک نرم افزار رایگان هست به نام Maxima که می تونید دانلود کنید که محاسبات عددی و سمبولیک انجام میده که من اونجا امتحان کردم این هم کد:

N:9;
om0:1.32551104310002;
eps:0.100503781525921;
allroots(bfloat (taylor(1+eps*%i *cosh((N-3 )*acosh( (p/%i)*sqrt(( om0^2-1)/( om0^2-(p/%i)^2)) )+3*acosh( (p/%i))),p,0,50)));

ehsan_faal
چهارشنبه 16 مهر 1393, 21:51 عصر
ممنون بابت پاسخگویی ولی یعنی راهی نداره که محاسبات تو متلب انجام بشه؟اخه این یه بخشی از کد اصلیه و نمیشه واسه هر بار اجرا نتایج رو به یه نرم افزار دیگه داد و گرفت

rahnema1
چهارشنبه 16 مهر 1393, 22:01 عصر
شاید درست وارد نمی کنید. دقیقا نمیدونم مشکل کجاست

ehsan_faal
چهارشنبه 16 مهر 1393, 22:11 عصر
شاید درست وارد نمی کنید. دقیقا نمیدونم مشکل کجاست
این کدیه روش کار میکنم،اگه امکانش هست یه بار چکش کنید.

http://s5.picofile.com/file/8144861600/Numeric.zip.html

rahnema1
چهارشنبه 16 مهر 1393, 22:22 عصر
چون با نرم افزار octave کار می کنم ( شبیه متلب) نمیتونم تست کنم شاید این جواب بده:

syms x
Eq=1+1j*0.100503781525921*cosh((9-3)*acosh((x/1j)*sqrt((1.32551104310002^2 -1)/(1.32551104310002^2 -(x/1j)^2)))+3*acosh(x/1j));
T= taylor(Eq,'Order',50)

ehsan_faal
چهارشنبه 16 مهر 1393, 22:30 عصر
نه،کار نکرد،به هر حال ممنون بابت وقتتون