سلام
خسته نباشید آقای قاسمیان
ببخشید باز زحمت دارم میخوام یه برنامه بنویسم همون اول کار به tanh اش ایراد گرفت میشه لطف کنید این ایرادمو رفع کنید تا بتونم بقیه برنامه امو بنویسم خیلی خیلی ممنونم
مطمئنم در ادامه اش بازم به ایراد بر میخورم بازم براتون زحمت میشم
مشاهده پیوست 228108
مشاهده پیوست 228107
انتگرال زیر را میخوام بنویسم از دستور int استفاده کنم اشتباه هست؟ از چه دستوری استفاده کنم بهتره؟ ممنون که راهنماییم میکنید
مشاهده پیوست 228114
q = integral(fun,xmin,xmax)
درودواقعا شرمنده
به خدا هر موقع جواب سوالامو میدید خیلی خیلی دعاتون میکنم. بدون کمک شما واقعا نمیتونم بنویسم . کل برنامه ای که باید بنویسم و نوشتم نمیفهمم از* چرا ایراد میگیره خواهش میکنم بهم بازم کمک کنید
مشاهده پیوست 228123
مشاهده پیوست 228122
راستی نمودار و تابعی که باید برنامه آن را بنویسیم Dx و نمودارشم معلومه
مشاهده پیوست 228124
clc;
a=@(n,x)(1/pi*integral(@(t)(0.5.*tanh(0.5.*x.*cos(t)).*cos(n.*t)),-pi,pi));
NUM_N=100;
X=0:26;
NUM_X=size(X,2);
D=zeros(1,NUM_X);
for i=2:NUM_X
x=X(i);
for n=2:NUM_N
nn=2*n-1;
D(i)=D(i)+(nn/(nn^2-1))^2*(a(nn,x)/a(1,x))^2;
end
D(i)=sqrt(D(i));
fprintf('x=%3d, D(x)=%f\n',x,D(i))
end
plot(X,D)
گذاشتن علامت @ برای اینه که به متلب بفهمونیم متغیر(ها)مون توی فرمولی که نوشتیم، چی هستش، که اون متغیر(ها) بعد از علامت @ و داخل پرانتز میان؛ بعدش هم خودِ رابطه...یه دنیا ازتون ممنونم که کمکم کردید . برا اینکه بفهمم میتونید اگه دردسر براتون نداره بهم بگید چرا(t )@ منظورم اینه به چه دلیل تتا در t که در پرانتز ضرب شده ؟ همینطور اولش که در (n,x) ضرب شده واقعا نمیفهممش. اگه سختتون هست جواب ندید این مشکل ذهن خودمه مثل این برنامه نیست که زمان تحویل به استاد داره آخرش میفهمم . امیدوارم یه روز کسی هم مشکلای شما رو رفع کنه
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
g=gradient(f,[x1,x2,x3]);%gradiant
h=hessian(f);% hessian
b=inv(h)%makoos hessian
t=-g.'%menhaye tranahade g
s=t*b
x=x0+k*s
m=eval(x)
x(1)=x0(1)
x(2)=x0(2)
x(3)=x0(3)
z=subs(f,m)
y=subs(z,[x1,x2,x3],[x(1),x(2),x(3)])
p=diff(y)
سلام دوست عزيز
الگوريتمي كه استادتون گفته چيه؟
با سلام مجدد
این هم الگوریتم
ابتدا باید تابع f(x)=2*x1^2- 3*x1*x3+4*x2^3+3*x2*x1+3 رو تعریف کرد
انتخاب نقطه ی اولیه (x0) و مقدار همگرایی (e=0.1)
محاسبه گرادیان تابع
محاسبه ماتریس hessian
محاسبه ترانهاده ی گرادیان تابع
تشکیل بردار s که برابر است با ترانهاده ی گرادیان تابع ضربدر معکوش ماتریس hessian
تشکیل ماتریس x که برابر است با x0+ks (مقدار k در ادامه محاسبه می شود) یادآوری s یک بردار است
قرار دادن ماتریس x در تابع (تابع به تابعی تک متغیره بر حسب k تبدیل میشود )
مشتق گیری از تابع یک متغیره
مشتق تابع تک متغیره را برابر صفر می گذاریم تا مقدار k به دست آید
قرار دادن مقدار k در ماتریس x
مقایسه ماتریس x با x0 (مقدار اولیه)
اگر قدر مطلق اختلاف ماتریس x با x0 بزرگتر از e (نقطه ی همگرایی) بود x مقدار اولیه جدید می شود و بر می گردیم به محاسبه گرادیان تابع
وگرنه ماتریس x مقدار مینیمم تابع می باشد
مشکل من اینجاست که وقتی مشتق تابع تک متغیره را برابر صفر قرار داده و حل می کنم، جواب صفر می شود در کد سوال اولم، این مشتق رو به p اختصاص دادم
(p=diff(y
و وقتی از دستور (solve (p استفاده می کنم ، جواب برابر صفر می شود
z=subs(f,[x1,x2,x3],m)
به نام خدا
با سلام
می خواستم برنامه ای بنویسم که تابع چند متغیره غیر خطی زیر رو مینیمم سازی کنم. اما تا حدودی تونستم جلو برم و چند خط آخر رو نتونستم مانند الگوریتمی که استاد داده کد نویسی کنم
می دونم چند جایی اشتباه کردم
اما چون متلب رو تازه یاد گرفتم نمی دونم چطور الگوریتمی که استاد توضیح داده رو پیاده سازی کنم
کدی رو که تا حالا نوشتم رو می ذارم
ممنون می شم راهنماییم کنید و کد رو اصلاح کنید
با نشکر
کد:clc clear close all syms f x1 x2 x3 k m p l o x0=[0, -1, 1] tol=0.1; f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3; g=gradient(f,[x1,x2,x3]);%gradiant h=hessian(f);% hessian b=inv(h)%makoos hessian t=-g.'%menhaye tranahade g s=t*b x=x0+k*s m=eval(x) x(1)=x0(1) x(2)=x0(2) x(3)=x0(3) z=subs(f,m) y=subs(z,[x1,x2,x3],[x(1),x(2),x(3)]) p=diff(y)
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
p=diff(y)
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
p=diff(y)
u=solve (p)
k=u
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
[code/]
با سلام مجدد
ممنون از جواب خوبتون
متاسفانه به یک مشکل جدید بر خوردم
حال کهمی خوام k رو در معادله x=x0+k*s وارد کنم خطای زیر رو می ده
من هم تو کد خودم امتحان کردم و هم در کد خلاصه شده شما
که این خطاهای مشابه رو داد
مشاهده پیوست 228147
ابعاد ماتريس ها برابر نيست دوست عزيز
احتمالا k دو در يك هست و x0 يك در سه. ابعاد رو بررسي كنيد
اگر نشد كدي كه اضافه كردين رو بدين ببينم چيه
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
p=diff(y)
u=solve (p)
k=u
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
clc
clear
close all
syms f x1 x2 x3 k m p u o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
g=gradient(f,[x1,x2,x3]);%gradiant
h=hessian(f);% hessian
b=inv(h)%makoos hessian
t=-g.'%menhaye tranahade g
s=t*b
x=x0+k*s
m=subs(f,x)
x(1)=x0(1)
x(2)=x0(2)
x(3)=x0(3)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],[x(1),x(2),x(3)])
p=diff(y)
u=solve(p)
k=u
x=x0+k*s
این چیزی هست که در کد شما اضافه کردم
کد:clc clear close all syms f x1 x2 x3 k m p l o x0=[0, -1, 1] tol=0.1; f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3 m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f)))) z=subs(f,[x1,x2,x3],m) y=subs(z,[x1,x2,x3],x0) p=diff(y) u=solve (p) k=u m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))))
این هم کد خلاصه نشده
کد:clc clear close all syms f x1 x2 x3 k m p u o x0=[0, -1, 1] tol=0.1; f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3; g=gradient(f,[x1,x2,x3]);%gradiant h=hessian(f);% hessian b=inv(h)%makoos hessian t=-g.'%menhaye tranahade g s=t*b x=x0+k*s m=subs(f,x) x(1)=x0(1) x(2)=x0(2) x(3)=x0(3) z=subs(f,[x1,x2,x3],m) y=subs(z,[x1,x2,x3],[x(1),x(2),x(3)]) p=diff(y) u=solve(p) k=u x=x0+k*s
در واقع در خط آخر یکی از خطوط برنامه رو تکرار کردم
و این هم خاطر نشان کنم که k یک عدد هست. البته نمی دونم متلب همه عددها رو در قالب ماتریس میشناسه یا نه
اما به هر حال این خطوط تو برنامه وجود داشتند و خطا نمی دادن حالا که تکرار شدن خطا میدن
k=u(1)
ممنون کدی که گفتید رو اصلاح کردم
و خطا نداد
اما مشکلی که دارم اینه که مقدار x باید الان فقط اعداد ثابت شده باشه. چون k که عدد شد . اما انگار برنامه متوجه نمی شود که به جای x1 x2 x3 در ماتریس s باید مقادیر x0 را قرار دهد
به نظر شما باید چیکار کرد؟ آیا باید دوباره مقادیر x0 رو به x1 x2 x3 نسبت داد یا اینکه کاری دیگه رو باید انجام بدم؟
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1];
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
p=diff(parsazahed(f,x0,x1,x2,x3,k));
k=solve(p);
parsazahed(f,x0,x1,x2,x3,k(1))
function y = parsazahed(f,x0,x1,x2,x3,k)
m=eval(x0+k*(-gradient(f,[x1,x2,x3])')*(inv(hessian(f))));
z=subs(f,[x1,x2,x3],m);
y=subs(z,[x1,x2,x3],x0);
end
clc
clear
close all
syms f x1 x2 x3 k m p u o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
g=gradient(f,[x1,x2,x3]);%gradiant
h=hessian(f);% hessian
b=inv(h)%makoos hessian
t=-g.'%menhaye tranahade g
s=t*b
x=x0+k*s
m=subs(f,x)
x(1)=x0(1)
x(2)=x0(2)
x(3)=x0(3)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],[x(1),x(2),x(3)])
p=diff(y)
u=solve(p)
k=u(1)
x1=x0(1)
x2=x0(2)
x3=x0(3)
x=x0+k*s
اگه لطف کنید بگید بعد از دستور k=u(1) چه دستوری دقیقا بنویسم ممنون میشم
clc
clear
close all
syms f x1 x2 x3 k m p l o
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
g=gradient(f,[x1,x2,x3]);%gradiant
h=hessian(f);% hessian
b=inv(h)%makoos hessian
t=-g.'%menhaye tranahade g
s=t*b
x=x0+k*s
m=eval(x)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
p=diff(y)
u=solve(p)
k=u(1)
x=x0+k*s
m=eval(x)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
clear
close all
syms f x1 x2 x3 k m p l o
imax=100;
x0=[0, -1, 1]
tol=0.1;
f=(2*x1^2)-(3*x1*x3)+(4*x2^3)+(3*x2*x1)+3;
for i=1:imax
g=gradient(f,[x1,x2,x3]);%gradiant
h=hessian(f);% hessian
b=inv(h)%makoos hessian
t=-g.'%menhaye tranahade g
s=t*b
x=x0+k*s
m=eval(x)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
p=diff(y)
u=solve(p)
k=u(1)
x=x0+k*s
m=eval(x)
z=subs(f,[x1,x2,x3],m)
y=subs(z,[x1,x2,x3],x0)
count=1;
if (abs(y-x0))<tol;
disp('the answer is:');disp(x(i));count
break
else
x0=y
end
end
سلام
راستش x0 اولیه رو خودمون انتخاب می که به صورت مختصات است. برای مثال (1,-1,0) اما طبق مراحل برنامه انگار عددی که به دست میاد و به عنوان x مینیممم باید تفاضلش با x0 رو با تلورانس مقایسه کنیم ، ماتریس یک در یک هست. باید کاری کنیم که نتیجه ی ما که قراره تفاضلش با x0 مقایسه بشه خودش هم یک ماتریس سه در یک باشه. اما حتی اگه این مشکل هم حل بشه مشکل اصلی مقایسه این تفاضل با تلورانس هست. چون تلورانس رو استاد یک عدد در نظر گرفته و نه ماتریسی که سه تا پارامتر داره
آیا از نظر منطقی میشه یک عدد رو با سه متغیر مقایسه کرد؟
البته الان که فکر کردم به نظرم رسید باید با تک تک سه درایه مقایسه بشه. اما خب مشکل اولش چی؟ مشکلی که در طی برنامه ما به یک عدد رسیدیم و نه به ماتریسی که سه درایه داره؟
نمی دونم امیدوارم شما به الگوریتم برنامه تسلط داشته باشید و بتونید کاری کنید که ما در نهایت ماتریس داشته باشیم، ممنون میشم
من طبق حدس خودم فکر کردم y جواب هست (مینیمم) اما در اصل باید اون x=x0+k*s جواب باشه که تو سوالات قبلی مشکلم این بود که هنوز تو x متغیرهای x1 x2 x3 وجود دارن. حالا نمی دونم تو اصلاحیه شما معادل با این ماتریس x چی هست؟ (معادل این ماتریس باید ماتریسی باشه که متغیر نداشته باشه. چون طبق روندی که جلو اومدیم k مقدارش مشخص شد. مقادیر x1 x2 x3 در s هم مشخص هستندx0 که مشخصه
پس باید در نهایت ماتریسی داشته باشیم که همه درایه هاش عدد ثابت هستند.)
خیلی طولانی شد ببخشید. پس سوالم اینه که معادل ماتریس x شما چی نوشتید
Thread starter | عنوان | تالار | پاسخ ها | تاریخ |
---|---|---|---|---|
F | سوالات و مشکلات در متلب | MATLAB | 1 | |
N | راهنمایی پیاده سازی کلاسبند جنگل تصادفی و خوشه بند DBSCAN در متلب | MATLAB | 0 | |
ب | کمک در برنامه نویسی متلب...فوری | MATLAB | 0 | |
A | شبیه سازی متغییر گسسته وپیوسته باهم برای یک مسئله در متلب 2014 | MATLAB | 0 | |
A | درخواست کمک در پروژه متلب.فوری | MATLAB | 4 |