1樓:久久不能記住
clear,clc
%% 求ln(x+sinx)=0的根。初值x0分別取0.1, 1,1.5, 2, 4進行計算
eq1 = @(x) log(x+sin(x));
x10 = [.1,1.5,2,4];
[x1,val1,flag1] = arrayfun(@(i)newton(eq1,x10(i)),1:length(x10));%未加速
[x1s,val1s,flag1s] = arrayfun(@(i)newton(eq1,x10(i),1),1:length(x10));%加速
%% 求sinx=0的根。初值x0分別取1,1.4,1.6, 1.8,3進行計算
eq2 = @(x) sin(x);
x20 = [1,1.4,1.6,1.8,3];
[x2,val2,flag2] = arrayfun(@(i)newton(eq2,x20(i)),1:length(x20));%未加速
[x2s,val2s,flag2s] = arrayfun(@(i)newton(eq2,x20(i),1),1:length(x20));%加速
以上程式要用到的newton函式如下,已經幫你整合了steffensen加速法,具體用法函式裡邊寫得很清楚,自己複製貼上到m檔案儲存,m檔案命名為newton.m,放在同一路徑下方可使用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%牛頓法解方程
%[x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%x為方程的解;
%val為上述x帶入eq的值;
%exitflag為1,求解成功;exitflag為0,達到最大迭代次數未收斂;
%exitflag為-1,步長達到最小未收斂;
%eq:函式控制代碼;
%x0:初值,預設為0到1隨機;
%steff為加速引數,非負則加速。預設不加速;
%tol:容差,預設1e-10;
%mindx:最小迭代步長,預設1e-8;
%maxiter:最大迭代數目,預設1e4;
%例如 x = newton(@(x)log(x+sin(x)),1) 得到 x = 0.5110;
%14-nov-2011 11:39:48,by jjbnjz
if ~isa(eq,'function_handle')
error('我擦,要我說幾遍你才知道要用函式控制代碼啊')
endif nargin < 6
maxiter = 1e4;
if nargin < 5
mindx= 1e-8;
if nargin < 4
tol= 1e-10;
if nargin < 3
steff = -1;
if nargin < 2
warning('初值都沒給,那從0到1之間隨便選了啊')
x0 = rand;
endend
endend
endx = x0;
val = eq(x0);
exitflag = 1;
eval(['df =@(x)' char(diff(eq(sym('x')))),';']);
if abs(val) <= tol
disp('你給的初值就是解,還算個毛啊,再見')
return
endif steff <= 0
for iter = 1 : maxiter
val = eq(x);
dval = df(x);
xnew = x - val/dval;
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
endif abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步長已經小於設定的最小步長(預設1e-8),',...
'而表示式的值沒有小於給定容差(預設1e-10)'])
x = xnew;
return
endx = xnew;
endelse
st=@(x)x - eq(x)/df(x);
for iter = 1 : maxiter
xnew = x - (st(x)-x)^2 / (st(st(x)) -2*st(x) + x);
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
endif abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步長已經小於設定的最小步長(預設1e-8),',...
'而表示式的值沒有小於給定容差(預設1e-10)'])
x = xnew;
return
endx = xnew;
endend
disp('因達到最大迭代次數而終止,求解失敗;解決方法,要麼增大容差(精度下降),要麼增大迭代次數(變慢)')
exitflag = 0;
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
問題分析什麼的就自己寫吧,無非是些:「解方程,初值是關鍵」,「自從我用了steffensen的加速方法後,嘿,還別說,還真對得起咱這張臉,從前不收臉的也收臉了,收臉的速度的也快了」,「牛頓法求解方程得到的解和初值間的距離居然和初值的導數值有關,導數值越小的初值解出來離初值越遠,怎麼回事呢?自己看書吧」,「不管怎麼說,steffensen還是收斂的比較好的,相比沒有他,我們離初值更近了╮(╯_╰)╭」
2樓:匿名使用者
同學,你交大的吧,自己學一下matlab。
3樓:魏把缺
function x_star=newton(fname,dfname,x0,e,n)
if nargin<5
n=50;
endif nargin<4
e=10^(-5);
enddigits(50);
x=x0;
x0=x+2*e;
k=0;
while abs(x0-x)>e
k=k+1;
if k>n
error('迭代失敗');
return;
endx0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);
disp(x);
endx_star=x;
disp(k);end
4樓:普寧市電器廠
兄弟你是選的趙海良的課呀?
用matlab求一道數值分析的題
用matlab程式設計數值分析的一道題目有。
5樓:匿名使用者
程式如下:
x=[0 1 2 3 4 5 7 9 10 11 11.5 12 ] ;
y=[0 1.5 3.2 4.
8 5.5 6.4 9.
6 7.5 6.7 7.
8 8.2 8.5];
a1=polyfit(x,y,3);
syms x
f3=vpa(poly2sym(a1,x),4)%多項式三次擬合結果
a2=polyfit(x,y,5);
f5=vpa(poly2sym(a2,x),4)%多項式五次擬合結果
x1=0:0.001:13;
h1=polyval(a1,x1);
h2=polyval(a2,x1);
plot(x,y,'o',x1,h1,x1,h2)
xlabel('x');
ylabel('y')
title('多項式3,5次擬合擬合曲線')
legend('原始資料點','3次擬合','5次擬合')
結果:f3 =
0.006647*x^3 - 0.2154*x^2 + 2.325*x - 0.3845
f5 =
0.0007557*x^5 - 0.01867*x^4 + 0.1477*x^3 - 0.5009*x^2 + 2.092*x - 0.03306
matlab 解析解轉換數值解
6樓:匿名使用者
subs 替換變數為數值
double 將解析解符號轉變為雙精度數值
7樓:
你可能誤解了解析解與數值解的**。
solve給你的是解析解,你得到解析解以後,給引數賦值,然後再使用eval()函式,即可得到結果(但不是你說的數值解)。
如果需要數值解,用積分來說吧,我們有辛普森(simposon),trapzoidal等方法,解方程還有gradient based等。
這些matlab也有相關的函式。
建議你看一本書,叫做:computaitonal methods for engineers,裡面都是用matlab實現數值解的方法。
8樓:
你可以自己編個演算法,比如計算方法裡講過的二分法和切線法都是數值解的解法
9樓:匿名使用者
vpa(解析解)=數值解
10樓:匿名使用者
都有解析解了你還要數值解幹嘛?把變數帶進去不就是數了麼,不理解你是啥意思。
matlab 解方程用matlab 解這個方程的數值解,急 10
11樓:和藹的禾鬥
我求解出現複數,感覺這不是你想要的結果,但我還是放這吧!
solve('((5.7182*x^2-9.4364*x+5.577)/(1-2*x))*log((1-x)/x)+3.7182*log(x)-1.704=0','x')
ans =
.50000000000000000000000000000000+.17473052282862965912408182829672*i
誰能幫我做一下關於數值分析的一道題,謝謝啦!用matlab
12樓:匿名使用者
xi_a= [0.2 0.4 0.6 0.8 1.0];
fxi_a= [0.98 0.92 0.81 0.64 0.38];
xi_b= [0.2,0.2+0.08*1,0.2+0.08*11,0.2+0.08*10]; %所求(xi,yi)橫座標
fxi_b= interp1(xi_a,fxi_a,xi_b,'linear'); %這是線性差值
fxi_c= interp1(xi_a,fxi_a,xi_b,'spline'); %這是?三次樣條函式?
fxi_d= interp1(xi_a,fxi_a,xi_b,'newton'); %這是?牛頓差值?
或者可以參考
一道Matlab程式設計題,matlab程式設計題
義敏學系歌 可是,你為什麼要到我這個mathematica專攻的團隊來提問呢 那我也給個mma的解法來消滅這個提問吧 nintegrate sqrt total d t 2 400.953 開濮耿昭 1.首先舉一個簡單的例子 求y x 2 在x為 0,2 上的曲線長度。把下面的複製貼上進matlab...
求解一道生物題,求解一道c語言題
sch知與誰同 當然題目只有限定於二倍體生物,且預設兩個次級精母細胞只有乙個 異常才有解,答案為axb,0y,0y。這種題目的解法就是要通過雙向推理還原 過程 aaxby經細胞減一之前的間期複製後,基因組成為a aa axb xby y,之後無論怎麼 基因的種類與數量應該不變 再從結果分析,a與a出...
求解一道物理題,求解一道物理題
一開始物體的速度大於傳送帶的速度,相對傳送帶向下滑動,物體受到的摩擦力方向沿斜面向上。a g sin30 cos30 10 0.5 0.75 2.5m s 2,方向沿斜面向上。物體做勻減速運動。末速度取v 2m s和皮帶輪速度相同。位移設為x,則有 v 2 v0 2 2ax 4 64 2 2.5 x...