سئوالات و مشکلات در متلب (MATLAB)

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
سلام
دوستان مورد اول تقسیم نقطه به نقطه است و متوحه شدم
اما دومی جریان چیه؟ این تک عدد چطور بدست امده؟

کاری که شما دارید انجام می دید، در حقیقت معادل با حل یک دستگاه معادلات جبری خطی با 6 معادله و 1 مجهوله. در جبر خطی به همچین مسأله ای می گن "دستگاه معادلات بیش شناخته" یا Over-determined. معمولاً چنین دستگاهی جواب یگانه نداره، اما میشه بهترین جواب ممکن رو با (مثلاً) معیار کمینه مجموع مربعات خطا، به دست آورد؛ که اتفاقاً کار شما نتیجه اش معادل با این کاره. این نوع دستگاههای معادله معمولاً در نتیجه آزمایش به دست میان...
معمولاً کسی این طوری این نوع مسأله ها رو حل نمی کنه. اگه برات خیلی مهمه؛ بگو بعداً بیشتر توضیح بدم.
 

Hadie89

عضو جدید
سلام
دوستان کسی کد برنامه رانگ کاتا برای دستگاه معادلات دیفرانسیل اماده داره؟ یدونه که درست ران شه
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
سلام
دوستان کسی کد برنامه رانگ کاتا برای دستگاه معادلات دیفرانسیل اماده داره؟ یدونه که درست ران شه

از لینک امضای من می تونی کل برنامه های کتابم رو، از جمله برنامه های رانگ ـ کوتا، رو دانلود کنید؛ همگی تست شده و درست کار می کنن.
 

Hadie89

عضو جدید
از لینک امضای من می تونی کل برنامه های کتابم رو، از جمله برنامه های رانگ ـ کوتا، رو دانلود کنید؛ همگی تست شده و درست کار می کنن.
خیلی ممنون دانلود کردم ولی نمیدونم چرا هر چی استپ رو کوچکتر میکنم جواب ها غلط تر میشن، نمودارام بدتر میشن
 

irpersian20

عضو جدید
با درود
دوستان چرا عکس اول خطا داریم و عکس دوم خیر؟
دقیقا چه فرقی هست؟ مشکل از چه لحاظ هست؟




 

ma5967

عضو جدید
با درود
دوستان چرا عکس اول خطا داریم و عکس دوم خیر؟
دقیقا چه فرقی هست؟ مشکل از چه لحاظ هست؟




همونطور که تو خطای متلب توضیح داده شما x رو تو عکس اول به صورت ماتریس 1*7 تعریف کردین و توان 2 برای توابع مربعی وجود داره. ولی وقتی که از (.) قبل از عملیات ضرب ، تقسیم و توان و ... استفاده کنید به صورت اسکالر به اسکالر این عملیات رو انجام میده
 

irpersian20

عضو جدید
ممنون
ببخشید دوستان این دستور زیز، کجا ها رو میاد ستاره میزاره؟
کد:
[LEFT] plot(z,'r:*')
[/LEFT]
ماتریس هم magic با ارگومان 3 بوده
کلا به کجا ها میرسه ستاره میزنه؟ ممنون
 

irpersian20

عضو جدید
ممنون از پاسخ شما . تشکر
جسارتا این جا چی؟ اینها هم به جای ضرب ، از ضرب داخلی بهره برده

 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
خیلی ممنون دانلود کردم ولی نمیدونم چرا هر چی استپ رو کوچکتر میکنم جواب ها غلط تر میشن، نمودارام بدتر میشن

ـ قرار نیست جواب هر معادله ای با کوچیک کردن گام بهتر بشه؛ ولی معمولاً برای خیلی از مسائل بهتر میشه.
ـ خواستی برنامه رو بذار اینجا ببینم چیکار کردی.
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
ممنون
ببخشید دوستان این دستور زیز، کجا ها رو میاد ستاره میزاره؟
کد:
[LEFT] plot(z,'r:*')
[/LEFT]
ماتریس هم magic با ارگومان 3 بوده
کلا به کجا ها میرسه ستاره میزنه؟ ممنون

همه نقاط
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
ممنون از پاسخ شما . تشکر
جسارتا این جا چی؟ اینها هم به جای ضرب ، از ضرب داخلی بهره برده

ضرب داخلی نه؛ "ضرب درایه به درایه" یا "element by element"
برای "تقسیم" و "نما" هم "به طور مشابه، "درایه به درایه" داریم.
 

Hadie89

عضو جدید
ـ قرار نیست جواب هر معادله ای با کوچیک کردن گام بهتر بشه؛ ولی معمولاً برای خیلی از مسائل بهتر میشه.
ـ خواستی برنامه رو بذار اینجا ببینم چیکار کردی.
سلام
اول یه توضیحی بدم : من شش تا ode دارم که باید همزمان حل بشن دلیل اینکه از سولور های ode45,ode15s و اینها استفاده نکردم این بوده که tspan من از صفر شروع نمیشه و هر چقدر که تو هلپ متلب و نت جستجو کردم راهی برای تعریف تی اسپن از نقطه غیر صفر پیدا نکردم این شد که تصمیم گرفتم با رانگ کاتا حل کنم
 

Hadie89

عضو جدید
Untitledcc1.jpg
سلام
اول یه توضیحی بدم : من شش تا ode دارم که باید همزمان حل بشن دلیل اینکه از سولور های ode45,ode15s و اینها استفاده نکردم این بوده که tspan من از صفر شروع نمیشه و هر چقدر که تو هلپ متلب و نت جستجو کردم راهی برای تعریف تی اسپن از نقطه غیر صفر پیدا نکردم این شد که تصمیم گرفتم با رانگ کاتا حل کنم
 

Hadie89

عضو جدید
clc;
clear;
close all;
% Reaction Parameters
P=1;
T=800;
Tg=800;
Rg=8;
R=8.314;
% Molecular weight
M=2+28+44+32+16+18;
% R7
k=0.0265*exp(3968/Tg);
% R2
Tpar=800;
k2=4.93*1000*exp(-18552/Tpar);
k3=1.11*10*exp(-3548/Tpar);
k4=1.53*(10^(-9))*exp(25161/Tpar);
% Rcracking
rotar=51;
% R1
landa=3*(10^8)*exp(-30178/Tpar);
% Emulsion
emf=0.8;
% Hydodynamic Parameters
u0=0.13;
umf=0.09;
gama=0.005;
Nor=3.44;
% D reactor
% dre=0.078;
% l=0.078;
% a=0.65*(pi/4*(l^2)*(u0-umf))^0.4;
% h=1.3/(9.8^0.2)*(u0-umf/Nor)^0.4;
ue=umf/emf;
D=0.01;
% Diff coef (eq kbc)
Dc=0.01;
fdot=@(t,y)[(-(2.19*(10^(5)).*exp(-13127/Tg).*(y(1)*y(4)))+(2.7*10^3)*exp(-1510/Rg).*(y(2)*y(6)-(y(3)*y(1))/k))
((-10^17.6).*exp(-20000/Tg).*(y(2).^0.25).*(y(6).^0.5)-2.7.*(10^3).*exp(-1510/Rg).*(y(2)*y(6)-(y(3)*y(1))/k))
(0.5*(10^17.6)*exp(-20000/Tg)*(y(2)^0.25)*(y(6)^0.5)+1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)+2.7*(10^3)*exp(-1510/Rg)*(y(2)*y(6)-y(3)*y(1))/k)
(-0.5*(10^17.6)*exp(-20000/Tg)*(y(2)^0.25)*(y(6)^0.5)-2*1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8))
(-1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)*exp(-24343/Tg)*(y(5)^0.7)* (y(4)^0.8))
(2.19*(10^5)*exp(-13127/Tg)*y(1)*y(4)+2*1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)-2.7*(10^3)*exp(-1510/Rg)*(y(2)*y(6)-y(3)*y(1))/k)];
startval=[0.15 0.09 0.19 0 0.02 0];
step=0.1;
method=1;
myODERKGen(fdot,[0.2 0.8],startval,step,method);
 

Hadie89

عضو جدید
ـ قرار نیست جواب هر معادله ای با کوچیک کردن گام بهتر بشه؛ ولی معمولاً برای خیلی از مسائل بهتر میشه.
ـ خواستی برنامه رو بذار اینجا ببینم چیکار کردی.

یه سوال دیگه که داشتم اینه که من با خروجی گرفتن از این فاکنشن رانگ کاتای شمام مشکل دارم
http://www.www.www.iran-eng.ir/images/icons/icon9.gif
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
ممنون خوب چرا اینجا از ضرب درایه به درایه استفاده کرد؟ مگر ضرب معمولی نمیشد؟

ضرب معمولی چیه؟! من تا حالا نشنیدم.
در متلب ضربهای زیر رو داریم:
ـ ضرب ماتریسی
ـ ضرب اسکالر
ـ ضرب درایه به درایه
ـ ضرب داخلی بردارها
ـ ضرب خارجی بردارها

در ضربب درایه به درایه:
کد:
C = A .* B ==> c[SUB]ij[/SUB] = a[SUB]ij [/SUB]x b[SUB]ij[/SUB]
در مسأله شما، تنها ضرب و نمایی که امکان پذیره، همین درایه به درایه است.
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
سلام
اول یه توضیحی بدم : من شش تا ode دارم که باید همزمان حل بشن دلیل اینکه از سولور های ode45,ode15s و اینها استفاده نکردم این بوده که tspan من از صفر شروع نمیشه و هر چقدر که تو هلپ متلب و نت جستجو کردم راهی برای تعریف تی اسپن از نقطه غیر صفر پیدا نکردم این شد که تصمیم گرفتم با رانگ کاتا حل کنم

ـ توی توابع متلب لازم نیست tspan از 0 شروع بشه.
ـ توی خود راهنماش هم می تونید ببینید؛ کافیه توی پنجره فرمان دستور زیر رو تایپ کنید و Enter بزنید
کد:
help ode45
ـ تابع ode45 متلب، روش رانگ _ کوتای 4گام adaptive stepsize هستش؛ خیلی پیشرفته تر از اونیه که من نوشتم. البته ode15s متلب روش بسیار پیشرفته تریه.
ـ سولور که نوشته بودی چیه؟! من نشنیده بودم.
 

Hadie89

عضو جدید
ـ توی توابع متلب لازم نیست tspan از 0 شروع بشه.
ـ توی خود راهنماش هم می تونید ببینید؛ کافیه توی پنجره فرمان دستور زیر رو تایپ کنید و Enter بزنید
کد:
help ode45
ـ تابع ode45 متلب، روش رانگ _ کوتای 4گام adaptive stepsize هستش؛ خیلی پیشرفته تر از اونیه که من نوشتم. البته ode15s متلب روش بسیار پیشرفته تریه.
ـ سولور که نوشته بودی چیه؟! من نشنیده بودم.
solver منظورم بود،سالور باید مینوشتم :))))
نه اگه غیر صفر بدیم اصلا حساب نمیکنه یا اینکه فقط تو همون t اولیه میده که یه نقطس و غلطه. من امتحان کردم
 

Hadie89

عضو جدید
ـ توی توابع متلب لازم نیست tspan از 0 شروع بشه.
ـ توی خود راهنماش هم می تونید ببینید؛ کافیه توی پنجره فرمان دستور زیر رو تایپ کنید و Enter بزنید
کد:
help ode45
ـ تابع ode45 متلب، روش رانگ _ کوتای 4گام adaptive stepsize هستش؛ خیلی پیشرفته تر از اونیه که من نوشتم. البته ode15s متلب روش بسیار پیشرفته تریه.
ـ سولور که نوشته بودی چیه؟! من نشنیده بودم.
بعد یه سوال دیگه الان تو این فانکشن شما بخوایم هر ایگرگ رو برحسب تی پلات بگیریم چوری باید وارد کنیم؟
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
clc;
clear;
close all;
% Reaction Parameters
P=1;
T=800;
Tg=800;
Rg=8;
R=8.314;
% Molecular weight
M=2+28+44+32+16+18;
% R7
k=0.0265*exp(3968/Tg);
% R2
Tpar=800;
k2=4.93*1000*exp(-18552/Tpar);
k3=1.11*10*exp(-3548/Tpar);
k4=1.53*(10^(-9))*exp(25161/Tpar);
% Rcracking
rotar=51;
% R1
landa=3*(10^8)*exp(-30178/Tpar);
% Emulsion
emf=0.8;
% Hydodynamic Parameters
u0=0.13;
umf=0.09;
gama=0.005;
Nor=3.44;
% D reactor
% dre=0.078;
% l=0.078;
% a=0.65*(pi/4*(l^2)*(u0-umf))^0.4;
% h=1.3/(9.8^0.2)*(u0-umf/Nor)^0.4;
ue=umf/emf;
D=0.01;
% Diff coef (eq kbc)
Dc=0.01;
fdot=@(t,y)[(-(2.19*(10^(5)).*exp(-13127/Tg).*(y(1)*y(4)))+(2.7*10^3)*exp(-1510/Rg).*(y(2)*y(6)-(y(3)*y(1))/k))
((-10^17.6).*exp(-20000/Tg).*(y(2).^0.25).*(y(6).^0.5)-2.7.*(10^3).*exp(-1510/Rg).*(y(2)*y(6)-(y(3)*y(1))/k))
(0.5*(10^17.6)*exp(-20000/Tg)*(y(2)^0.25)*(y(6)^0.5)+1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)+2.7*(10^3)*exp(-1510/Rg)*(y(2)*y(6)-y(3)*y(1))/k)
(-0.5*(10^17.6)*exp(-20000/Tg)*(y(2)^0.25)*(y(6)^0.5)-2*1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8))
(-1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)*exp(-24343/Tg)*(y(5)^0.7)* (y(4)^0.8))
(2.19*(10^5)*exp(-13127/Tg)*y(1)*y(4)+2*1.58*(10^16)*exp(-24343/Tg)*(y(5)^0.7)*(y(4)^0.8)-2.7*(10^3)*exp(-1510/Rg)*(y(2)*y(6)-y(3)*y(1))/k)];
startval=[0.15 0.09 0.19 0 0.02 0];
step=0.1;
method=1;
myODERKGen(fdot,[0.2 0.8],startval,step,method);

ـ متغیر مستقلت چیه؟
ـ اون عبارت fdot الآن به ازای چی باید محاسبه بشه؟ بردار 6درایه ای جواب نمیده؟
ـ اون نقطه هایی که گذاشتید برای چیه؟ عملیات درایه به درایه نداریم که اینجا!
ـ این رویه رو دیدم بعضیها درس میدن؛ اما رویه معقولی نیست. معقولش اینه که معادلات دیفرانسیل رو توی یک فایل "تابع" جدا تعریف و ذخیره کنید. بعد توی یک فایل "دستخط" جدا با استفاده از این توابع حل معادله دیفرانسیل اون "تابع" رو فراخوانی و حل کنید. بعدش روی خروجیها هر پردازشی که خواستید انجام بدید. مثلا" معادلات رو توی یک تابع مثل زیر بنویسید و ذخیره کنید.
کد:
function fdot = LHS6ode(t,y)
...
...
fdot = ...

قبل از اینکه دستخط رو بنویسید، تابع رو تست کنید و مطمئن شید که درست کار می کنه.
و بعد یه دستخط مثل زیر بنویسید.
کد:
% main
...
...
[t,y] = ODERKGen(@LHS6ode, [0.2 0.8], startval, 0.05, 1);
...
...
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
solver منظورم بود،سالور باید مینوشتم :))))
نه اگه غیر صفر بدیم اصلا حساب نمیکنه یا اینکه فقط تو همون t اولیه میده که یه نقطس و غلطه. من امتحان کردم

اذیت نکن؛ من 19 ساله دارم از این توابع استفاده می کنم؛ همچین ادعایی درست نیست.
 

meytim

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

برای کشیدن نمودار y4 بر حسب t می تونید از دستور زیر استفاده کنید:
کد:
plot(t, y(:,4))

 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
اذیت نکن؛ من 19 ساله دارم از این توابع استفاده می کنم؛ همچین ادعایی درست نیست.

solver منظورم بود،سالور باید مینوشتم :))))
نه اگه غیر صفر بدیم اصلا حساب نمیکنه یا اینکه فقط تو همون t اولیه میده که یه نقطس و غلطه. من امتحان کردم

بخشی از راهنمای ode45:
کد:
>> help ode45
 ode45  Solve non-stiff differential equations, medium order method.
    [TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates 
    the system of differential equations y' = f(t,y) from time T0 to TFINAL 
    with initial conditions Y0. ODEFUN is a function handle. For a scalar T
    and a vector Y, ODEFUN(T,Y) must return a column vector corresponding 
    to f(t,y). Each row in the solution array YOUT corresponds to a time 
    returned in the column vector TOUT.  To obtain solutions at specific 
    times T0,T1,...,TFINAL (all increasing or all decreasing), use TSPAN = 
    [T0 T1 ... TFINAL].

همونطور که می بینی گفته از T0 تا TFINAL با شرایط اولیه Y0
نگفته از 0، و نگفته با شرایط اولیه صفر.
 

saeed.sb

عضو جدید
سلام من میخوام یک برای یک سیستم 2 یا چند درجه آزادی که شکلش هم دلخواه هست، مثلا همین سیستم جرم فنر دمپر معمولی، رو یا کد متلبش رو بنویسم یا این که بلوک دیاگرامش رو رسم کنم و بعد اون رو وارد سیملینک متلب کنم تا نمودارهای جابجایی تقسیم بر زمان رو رسم کنم
 

Hadie89

عضو جدید
ـ متغیر مستقلت چیه؟
ـ اون عبارت fdot الآن به ازای چی باید محاسبه بشه؟ بردار 6درایه ای جواب نمیده؟
ـ اون نقطه هایی که گذاشتید برای چیه؟ عملیات درایه به درایه نداریم که اینجا!
ـ این رویه رو دیدم بعضیها درس میدن؛ اما رویه معقولی نیست. معقولش اینه که معادلات دیفرانسیل رو توی یک فایل "تابع" جدا تعریف و ذخیره کنید. بعد توی یک فایل "دستخط" جدا با استفاده از این توابع حل معادله دیفرانسیل اون "تابع" رو فراخوانی و حل کنید. بعدش روی خروجیها هر پردازشی که خواستید انجام بدید. مثلا" معادلات رو توی یک تابع مثل زیر بنویسید و ذخیره کنید.
کد:
function fdot = LHS6ode(t,y)
...
...
fdot = ...

قبل از اینکه دستخط رو بنویسید، تابع رو تست کنید و مطمئن شید که درست کار می کنه.
و بعد یه دستخط مثل زیر بنویسید.
کد:
% main
...
...
[t,y] = ODERKGen(@LHS6ode, [0.2 0.8], startval, 0.05, 1);
...
...
متغیر مستقلم t هستش،اون نقطه هارو نمیزارم خودش اررور میده که یزار
 

Hadie89

عضو جدید
اذیت نکن؛ من 19 ساله دارم از این توابع استفاده می کنم؛ همچین ادعایی درست نیست.

من جسارت نکردم، اما شما امتحان کن یبار ببین حل میکنه؟ برا من که مثلا بین 0.2 تا 0.6 میخام بازه بدم فقط تو 0.2 حساب میکنه
 

Hadie89

عضو جدید
برای کشیدن نمودار y4 بر حسب t می تونید از دستور زیر استفاده کنید:
کد:
plot(t, y(:,4))


وای مرسی این کارکرد، من ایگرگ رو برعکس شما میدادم ینی میگگفتم سطر چهار و همه ستون ها اررور میداد
بعد ی چیز دیگه دستورارو چطوری اینجا مینویسید ؟ من بلد نیستم
 

رضاکلاته

عضو جدید
سلام من تازه مادربوردم رو عوض کرده ام مادربوردGIGABYTE H81M-S2PVگذاشتم روسیستمم دوویندوز10وXPدارم درویندوز10مشکلی برای شناختن فلشUSBندارم ولی درXPفلشUSBرونمی شناسه حتی به پشت کیس هم زدم ولی نمی شناسه لطفا راهنمایی کنید چکار کنم؟
 

Similar threads

بالا