[問題] 新手做二分法 最後一步求不出來已回收
版上各位大大好@@
剛開始學matlab, 試著做二分法,
只剩最後一步, 想了二天想不到方法,
所以上來請教是哪裡出問題orz
============================程式=========================
x=linspace(-10,10,1000); %函數的區間
y=sin(x); %函數
dy=cos(x); %一次微分式
dyy=-sin(x); %二次微分式
I=[]; %建立一個空矩陣,將求出的t值放入
I1=[]; %建立一個空矩陣,將求出的區間放入
for t=1:1000-1 %找出微分式為0的區間
if dy(t)*dy(t+1)<=0; %用微分式堪根
I=[I;[t t+1]];
I1=[I1;[x(t) x(t+1)]]; %將求出的區間放入空矩陣
end
end
[m0 n0]=size(I);
I2=[]; %存放極小值存在的區間
for s=1:m0-1
if dyy(I(s,1))>0 && dyy(I(s,2))>0
I2=[I2;I1(s,1) I1(s,2)];
end
end
I3=[]; %存放極小值
[m2 n2]=size(I2);
for s2=1:m2; %依序將每個極小值的區間做bisection
for s3=1:6; %做六次的二分法
x=linspace(I2(s2,1),I2(s2,2),3); %將區間切成二等分(3點)
x_l=x(1); %下界
x_u=x(3); %上界
x_r=x(2); %中間
if dy(2)*dy(3)<=0; %中點與上界的y值在一次微分式同號,則令中點為新上界
x_l=x_r;
x=linspace(x_r,x_u,3); %再一次將區間二等分
else dy(2)*dy(3)>0; %中點與上界的y值在一次微分式異號,則令中點為新下界
x_u=x_r;
x=linspace(x_l,x_r,3); %再一次將區間二等分
end
I3=[I3;y(2)];
end
end
=============================結束=================================
最後一個for迴圈是在做二分法
迴圈裡面跑出的x 己經是做完二分法 最後的區間
其相對應的值為 x(1), x(2), x(3)
所以x(2) 所對的y值就是最小值
我卡住的地方在於
原來的x=linspace(-10,10,1000); 不是己經被最後迴圈裡的x=linspace(x_l,x_r,3);
取代掉了嗎??
但是y(2) 的值依然是停在一開始x=linspace(-10,10,1000); 所對應的y(2)
Q:我該怎麼改 才能將y值對應到最後的x 讓I3裡放的是真正的極小值??
(除了再重寫一次y=sin(x)的方式)
感謝 m(_ _)m
--
▁▁ 達文西:
▕名人▏ 『我在年輕的時候便開始吃素,我相信有一天,
▕素寫▏ 人們會同我一樣視殺生如殺人。』
▇▇
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.130.100.189
推
10/28 02:56, , 1F
10/28 02:56, 1F
→
10/28 03:07, , 2F
10/28 03:07, 2F