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

رادیس

عضو جدید
سلام
خسته نباشید آقای قاسمیان
ببخشید باز زحمت دارم میخوام یه برنامه بنویسم همون اول کار به tanh اش ایراد گرفت میشه لطف کنید این ایرادمو رفع کنید تا بتونم بقیه برنامه امو بنویسم خیلی خیلی ممنونم
مطمئنم در ادامه اش بازم به ایراد بر میخورم بازم براتون زحمت میشم


یب.jpg


df.png
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
سلام
خسته نباشید آقای قاسمیان
ببخشید باز زحمت دارم میخوام یه برنامه بنویسم همون اول کار به tanh اش ایراد گرفت میشه لطف کنید این ایرادمو رفع کنید تا بتونم بقیه برنامه امو بنویسم خیلی خیلی ممنونم
مطمئنم در ادامه اش بازم به ایراد بر میخورم بازم براتون زحمت میشم


مشاهده پیوست 228108


مشاهده پیوست 228107

سلام
ممنون

شما فرمولتون رو اشتباه نوشتين. پرانتز ها و ضرب و تقسيم رو بيشتر دقت كنيد
علامت هاي ضرب رو هم هيچ جا نذاشتين. يكم فرمول نويسي با حالت دستي فرق داره ديگه. اين بدبخت آدم كه نيست. كامپيوتره :D
 

رادیس

عضو جدید
انتگرال زیر را میخوام بنویسم از دستور int استفاده کنم اشتباه هست؟ از چه دستوری استفاده کنم بهتره؟ ممنون که راهنماییم میکنید
df.png
 

amir ghasemiyan

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

چون بازه دارين بهتره از اين دستور استفاده كنيد:
کد:
q = integral(fun,xmin,xmax)
 

رادیس

عضو جدید
واقعا شرمنده
به خدا هر موقع جواب سوالامو میدید خیلی خیلی دعاتون میکنم. بدون کمک شما واقعا نمیتونم بنویسم . کل برنامه ای که باید بنویسم و نوشتم نمیفهمم از* چرا ایراد میگیره خواهش میکنم بهم بازم کمک کنید


بیی.png
gf.png
 

رادیس

عضو جدید
راستی نمودار و تابعی که باید برنامه آن را بنویسیم Dx و نمودارشم معلومه
sg.jpg
 

آبـی

کاربر بیش فعال
کاربر ممتاز
واقعا شرمنده
به خدا هر موقع جواب سوالامو میدید خیلی خیلی دعاتون میکنم. بدون کمک شما واقعا نمیتونم بنویسم . کل برنامه ای که باید بنویسم و نوشتم نمیفهمم از* چرا ایراد میگیره خواهش میکنم بهم بازم کمک کنید


مشاهده پیوست 228123
مشاهده پیوست 228122
درود :gol:

وقتی می‌خواید بردار رو در بردار (ماتریس رو در ماتریس) به صورت درایه به درایه ضرب کنید، باید قبل از *، یه علامت نقطه بذارید.
 

Fathy

متخصص مهندسی سازه و زلزله
راستی نمودار و تابعی که باید برنامه آن را بنویسیم 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) ضرب شده واقعا نمیفهممش. اگه سختتون هست جواب ندید این مشکل ذهن خودمه مثل این برنامه نیست که زمان تحویل به استاد داره آخرش میفهمم . امیدوارم یه روز کسی هم مشکلای شما رو رفع کنه
 

آبـی

کاربر بیش فعال
کاربر ممتاز
یه دنیا ازتون ممنونم که کمکم کردید . برا اینکه بفهمم میتونید اگه دردسر براتون نداره بهم بگید چرا(t )@ منظورم اینه به چه دلیل تتا در t که در پرانتز ضرب شده ؟ همینطور اولش که در (n,x) ضرب شده واقعا نمیفهممش. اگه سختتون هست جواب ندید این مشکل ذهن خودمه مثل این برنامه نیست که زمان تحویل به استاد داره آخرش میفهمم . امیدوارم یه روز کسی هم مشکلای شما رو رفع کنه
گذاشتن علامت @ برای اینه که به متلب بفهمونیم متغیر(ها)مون توی فرمولی که نوشتیم، چی هستش، که اون متغیر(ها) بعد از علامت @ و داخل پرانتز میان؛ بعدش هم خودِ رابطه...
 

parsazahed

عضو جدید
مینیمم سازی به روش نیوتون؟

مینیمم سازی به روش نیوتون؟

به نام خدا
با سلام
می خواستم برنامه ای بنویسم که تابع چند متغیره غیر خطی زیر رو مینیمم سازی کنم. اما تا حدودی تونستم جلو برم و چند خط آخر رو نتونستم مانند الگوریتمی که استاد داده کد نویسی کنم
می دونم چند جایی اشتباه کردم
اما چون متلب رو تازه یاد گرفتم نمی دونم چطور الگوریتمی که استاد توضیح داده رو پیاده سازی کنم
کدی رو که تا حالا نوشتم رو می ذارم
ممنون می شم راهنماییم کنید و کد رو اصلاح کنید
با نشکر
کد:
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)
 

parsazahed

عضو جدید
سلام دوست عزيز
الگوريتمي كه استادتون گفته چيه؟

با سلام مجدد
این هم الگوریتم
ابتدا باید تابع 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 استفاده می کنم ، جواب برابر صفر می شود
 
آخرین ویرایش:

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
با سلام مجدد
این هم الگوریتم
ابتدا باید تابع 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 استفاده می کنم ، جواب برابر صفر می شود

من فكر ميكنم خط 19 رو اشتباه نوشتين.
به اين صورت اصلاح كنيد ببينين درست ميشه يا نه
کد:
z=subs(f,[x1,x2,x3],m)
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
به نام خدا
با سلام
می خواستم برنامه ای بنویسم که تابع چند متغیره غیر خطی زیر رو مینیمم سازی کنم. اما تا حدودی تونستم جلو برم و چند خط آخر رو نتونستم مانند الگوریتمی که استاد داده کد نویسی کنم
می دونم چند جایی اشتباه کردم
اما چون متلب رو تازه یاد گرفتم نمی دونم چطور الگوریتمی که استاد توضیح داده رو پیاده سازی کنم
کدی رو که تا حالا نوشتم رو می ذارم
ممنون می شم راهنماییم کنید و کد رو اصلاح کنید
با نشکر
کد:
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)
 

parsazahed

عضو جدید
با سلام مجدد
ممنون از جواب خوبتون
متاسفانه به یک مشکل جدید بر خوردم
حال کهمی خوام k رو در معادله x=x0+k*s وارد کنم خطای زیر رو می ده
من هم تو کد خودم امتحان کردم و هم در کد خلاصه شده شما
که این خطاهای مشابه رو داد

راستی چرا شما در خط 8 از دستور subs به جای eval استفاده نکردید.

کد:
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/]
 

پیوست ها

  • error.jpg
    error.jpg
    35.2 کیلوبایت · بازدیدها: 0
  • error2.jpg
    error2.jpg
    34.2 کیلوبایت · بازدیدها: 0
  • error2.jpg
    error2.jpg
    34.2 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
با سلام مجدد
ممنون از جواب خوبتون
متاسفانه به یک مشکل جدید بر خوردم
حال کهمی خوام k رو در معادله x=x0+k*s وارد کنم خطای زیر رو می ده
من هم تو کد خودم امتحان کردم و هم در کد خلاصه شده شما
که این خطاهای مشابه رو داد
مشاهده پیوست 228147

ابعاد ماتريس ها برابر نيست دوست عزيز
احتمالا k دو در يك هست و x0 يك در سه. ابعاد رو بررسي كنيد
اگر نشد كدي كه اضافه كردين رو بدين ببينم چيه
 

parsazahed

عضو جدید
ابعاد ماتريس ها برابر نيست دوست عزيز
احتمالا 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

در واقع در خط آخر یکی از خطوط برنامه رو تکرار کردم
و این هم خاطر نشان کنم که k یک عدد هست. البته نمی دونم متلب همه عددها رو در قالب ماتریس میشناسه یا نه
اما به هر حال این خطوط تو برنامه وجود داشتند و خطا نمی دادن حالا که تکرار شدن خطا میدن
 
آخرین ویرایش:

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
این چیزی هست که در کد شما اضافه کردم

کد:
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 یک عدد هست. البته نمی دونم متلب همه عددها رو در قالب ماتریس میشناسه یا نه
اما به هر حال این خطوط تو برنامه وجود داشتند و خطا نمی دادن حالا که تکرار شدن خطا میدن

همونطور كه حدس ميزدم ابعاد ماتريس هاتون برابر نيست.
خط 13 رو اينطوري اصلاح كنيد
کد:
k=u(1)
 

parsazahed

عضو جدید
ممنون کدی که گفتید رو اصلاح کردم
و خطا نداد
اما مشکلی که دارم اینه که مقدار x باید الان فقط اعداد ثابت شده باشه. چون k که عدد شد . اما انگار برنامه متوجه نمی شود که به جای x1 x2 x3 در ماتریس s باید مقادیر x0 را قرار دهد
به نظر شما باید چیکار کرد؟ آیا باید دوباره مقادیر x0 رو به x1 x2 x3 نسبت داد یا اینکه کاری دیگه رو باید انجام بدم؟
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
ممنون کدی که گفتید رو اصلاح کردم
و خطا نداد
اما مشکلی که دارم اینه که مقدار x باید الان فقط اعداد ثابت شده باشه. چون k که عدد شد . اما انگار برنامه متوجه نمی شود که به جای x1 x2 x3 در ماتریس s باید مقادیر x0 را قرار دهد
به نظر شما باید چیکار کرد؟ آیا باید دوباره مقادیر x0 رو به x1 x2 x3 نسبت داد یا اینکه کاری دیگه رو باید انجام بدم؟

بايد دوباره نسبت بدين ديگه. شما دارين k رو تو m ميذارين. ولي شما نياز به y دارين
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
من كدهاتون رو بصورت فانكشن نوشتم. شايد اينطوري يكم راحت تر باشين:
اين كد اصليتون
کد:
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


 

parsazahed

عضو جدید
واقعا شرمنده
من الان تو کد خودم دوباره x0 رو به x1 x2 x3 نسبت دادم
و چک هم کردم که مقادیر جایگزین شده یا نه
اما انگار نرم افزار مشکل داره و بازم حرف خودش رو می زنه
کد:
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

راستی من هنوز تو استفاده از فانکشن هایی که خودمون تعریف می کنیم وارد نیستم . در این مورد هم کمک کنید که آیا تو یه فایل جدا باید تعریف بشه یا تو بین کدهای برنامه
 

parsazahed

عضو جدید
اگه لطف کنید بگید بعد از دستور k=u(1) چه دستوری دقیقا بنویسم ممنون میشم
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
اگه لطف کنید بگید بعد از دستور 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)


در خصوص فانكشن هم عرض كنم كه بله. يك ام فايل جدا بايد باشه و حتما هم اسم ام فايل با اسم تابع بايد يكي باشه و خود ام فايل هم بايد يا در مسير هاي متلب باشه يا در مسير ام فايلي كه دارين اجرا ميكنين بايد باشه
 

parsazahed

عضو جدید
سلام

خیلی ممنونم از کمکتون
همین طور در مورد توضیح فانکشن
:)

این کدی که نوشتید رو اجرا کردم و همون طور که گفتید مشکلی نداشت
اما خب من طبق الگوریتم باید قدر مطلق تفاضل نتیجه رو با x0 مقایسه کنم
برای اینکار اومدم قسمتی از برنامه رو در حلقه for قرار دادم و در انتهای حلقه ی for از شرط if استفاده کردم
تا قبل از این کار مشکلی نبود اما وقتی این دستورات رو اضافه کردم برنامه خطا داد و خطای برنامه مربوط به خط 19 هست. خطی که تا قبل از این مشکلی نداشت.
من کد جدید رو می ذارم ممنون می شم دوباره بررسی کنید
واقعا شرمنده

کد:
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
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
سلام
اين مشكل طبيعي هست دوست عزيز
x0 شما در ابتدا ماتريس 1*3 هست. ولي در شرط شما تبديلش ميكنين به يك داده معمولي. خب طبيعي هست كه مشكل ساز بشه

داده هاي اوليه x0 از كجا و بر چه اساسي تشكيل شدن؟ در شرط هم بايد بر همان اساس باشن
 

parsazahed

عضو جدید
سلام
راستش x0 اولیه رو خودمون انتخاب می که به صورت مختصات است. برای مثال (1,-1,0) اما طبق مراحل برنامه انگار عددی که به دست میاد و به عنوان x مینیممم باید تفاضلش با x0 رو با تلورانس مقایسه کنیم ، ماتریس یک در یک هست. باید کاری کنیم که نتیجه ی ما که قراره تفاضلش با x0 مقایسه بشه خودش هم یک ماتریس سه در یک باشه. اما حتی اگه این مشکل هم حل بشه مشکل اصلی مقایسه این تفاضل با تلورانس هست. چون تلورانس رو استاد یک عدد در نظر گرفته و نه ماتریسی که سه تا پارامتر داره
آیا از نظر منطقی میشه یک عدد رو با سه متغیر مقایسه کرد؟
البته الان که فکر کردم به نظرم رسید باید با تک تک سه درایه مقایسه بشه. اما خب مشکل اولش چی؟ مشکلی که در طی برنامه ما به یک عدد رسیدیم و نه به ماتریسی که سه درایه داره؟
نمی دونم امیدوارم شما به الگوریتم برنامه تسلط داشته باشید و بتونید کاری کنید که ما در نهایت ماتریس داشته باشیم، ممنون میشم
من طبق حدس خودم فکر کردم y جواب هست (مینیمم) اما در اصل باید اون x=x0+k*s جواب باشه که تو سوالات قبلی مشکلم این بود که هنوز تو x متغیرهای x1 x2 x3 وجود دارن. حالا نمی دونم تو اصلاحیه شما معادل با این ماتریس x چی هست؟ (معادل این ماتریس باید ماتریسی باشه که متغیر نداشته باشه. چون طبق روندی که جلو اومدیم k مقدارش مشخص شد. مقادیر x1 x2 x3 در s هم مشخص هستندx0 که مشخصه
پس باید در نهایت ماتریسی داشته باشیم که همه درایه هاش عدد ثابت هستند.)
خیلی طولانی شد ببخشید. پس سوالم اینه که معادل ماتریس x شما چی نوشتید
 

amir ghasemiyan

مدیر بازنشسته
کاربر ممتاز
سلام
راستش x0 اولیه رو خودمون انتخاب می که به صورت مختصات است. برای مثال (1,-1,0) اما طبق مراحل برنامه انگار عددی که به دست میاد و به عنوان x مینیممم باید تفاضلش با x0 رو با تلورانس مقایسه کنیم ، ماتریس یک در یک هست. باید کاری کنیم که نتیجه ی ما که قراره تفاضلش با x0 مقایسه بشه خودش هم یک ماتریس سه در یک باشه. اما حتی اگه این مشکل هم حل بشه مشکل اصلی مقایسه این تفاضل با تلورانس هست. چون تلورانس رو استاد یک عدد در نظر گرفته و نه ماتریسی که سه تا پارامتر داره
آیا از نظر منطقی میشه یک عدد رو با سه متغیر مقایسه کرد؟
البته الان که فکر کردم به نظرم رسید باید با تک تک سه درایه مقایسه بشه. اما خب مشکل اولش چی؟ مشکلی که در طی برنامه ما به یک عدد رسیدیم و نه به ماتریسی که سه درایه داره؟
نمی دونم امیدوارم شما به الگوریتم برنامه تسلط داشته باشید و بتونید کاری کنید که ما در نهایت ماتریس داشته باشیم، ممنون میشم
من طبق حدس خودم فکر کردم y جواب هست (مینیمم) اما در اصل باید اون x=x0+k*s جواب باشه که تو سوالات قبلی مشکلم این بود که هنوز تو x متغیرهای x1 x2 x3 وجود دارن. حالا نمی دونم تو اصلاحیه شما معادل با این ماتریس x چی هست؟ (معادل این ماتریس باید ماتریسی باشه که متغیر نداشته باشه. چون طبق روندی که جلو اومدیم k مقدارش مشخص شد. مقادیر x1 x2 x3 در s هم مشخص هستندx0 که مشخصه
پس باید در نهایت ماتریسی داشته باشیم که همه درایه هاش عدد ثابت هستند.)
خیلی طولانی شد ببخشید. پس سوالم اینه که معادل ماتریس x شما چی نوشتید

خب وقتي مقدار اوليه يك مختصات هست، مقدار نهايي هم بايد مختصات باشه ديگه. نميشه كه مختصات بديم و يك داده تحويل بگيريم.
اين قسمت رو شما بايد حل كنيد كه مبحث رو ميدونين. من فقط تو كدها ميتونم كمكتون كنم
 

parsazahed

عضو جدید
بله قبول دارم حرفتون رو
فقط ممنون می شم شما ماتریس x=x0+k*s رو به صورتی در بیارید که سه درایه ی اون اعداد ثابت باشند. مشکلم الان فقط همین هست.
بقیه اش انشالله اگه خطایی نده خودم حل می کنم
 

Similar threads

بالا