2013-10-19 38 views
0

我需要在matlab中求解一個非線性方程。有關詳細信息,請參閱代碼。在Matlab中使用求解函數

sigma = .25; 
beta = 2; 
alpha = .1; 
eta = .025; 

syms x 

phi = sqrt(2.*sigma.^2 + beta.^2); 
kappa = (beta + phi)./(beta - phi); 

w = .5; 

D is imported data; 

A = @(t) exp((alpha*(beta+phi).*t)./sigma.^2).*... 
    ((1-kappa)./(1-kappa.*exp(phi.*t))).^(2.*alpha./sigma.^2); 

B = @(t) (beta - phi)./sigma.^2 + 2.*phi./(sigma.^2.*(1-kappa.*exp(phi.*t))); 

C = @(t) exp(eta^2.*t^3/6); 

G = @(t) (alpha./phi).*(exp(phi.*t)-1).*exp(alpha.*(beta+phi).*t./sigma^2).*... 
    ((1-kappa)./(1-kappa.*exp(phi.*t))).^((2.*alpha./sigma^2) + 1); 

H = @(t) exp((alpha.*(beta+phi) + phi.*sigma^2)./sigma^2).*... 
    ((1-kappa)./(1-kappa.*exp(phi.*t))).^((2.*alpha./sigma^2) + 2); 

spread_prot_portion = @(i,j,t) exp(B(t).*x).*D(i,j).*(G(t) + H(t).*x); 
spread_fee_portion = @(i,j,t) A(t).*exp(B(t).*x).*D(i,j); 

t = (.5:.5:10); 
j = (1 :1 :20); 
k = 1:20 


solve('cds(1)- w*sum(spread_prot_portion(1,j(k),t(k)))/sum(spread_fee_portion(1,j(k),t(k))) = 0') 

請注意,cds是加載數據。我需要爲x解決。這就是爲什麼它是syms中唯一的變量,並且給出了所有其他變量。不幸的是,我不能只寫出一個表達式。一些幫助將不勝感激

+0

你確定解決方法是正確的嗎?我記得fsolve和其他人。 – berkay

+0

當您給出一個不會運行的示例時,我們很難提供幫助,因爲它基於導入的數據。另外,您是否在尋找'x'的分析/符號解決方案,即等式?還是數字解決方案,即實際數量?如果它是後者,那麼@berkay已經指出了,並且你正在使用錯誤的工具來完成這項工作,並且不應該使用符號數學,而是'fsolve'和浮點數。 – horchler

回答

0

對於這樣的情況,你需要使用for循環找到總和。假設

syms x; 
f = @(i, j) i + j + x; 

然後總和所有指標ij你需要

total = 0; 
for i = 1:10 
    for j = 1:10 
    total = total + f(i, j); 
    end 
end 
display(total) %// total = 100*x + 1100 

但是隨後爲您解決寫total = 100(注意缺少撇號)

xSol = solve(total - 100); 

注,您正試圖找到確切的解決方案來解決一個非常困難的問題。這可能是更好的使用fsolve,與

xSol = fsolve(@fun, estimateOfx); 

哪裏好玩計算的f(i,j)總和爲x特定值的函數,即

function total = fun(x) 
f = @(i, j) i + j + x; 
%// Find total as above 
end 

這裏是解釋fsolve一個小的例子多一點。