solve nonlinear equations with integration where the upper limit is variable
1 次查看(过去 30 天)
显示 更早的评论
Hi All,
I need to solve a group of nonlinear equations with integration where the upper limit is variable. The format is shown as below:
f(x,t) is a nonlinear equation without an explicit integraton form. f(x,t) is:
where a1-a6 is known. a6 is more than 800 so it makes f(x,t) have no explicit integraton form.
x(1), x(2), ...x(N) and Z(1), Z(2), ...Z(N) are known double values. The upper limit of the integration, d, is a non-negative variable vector and also the one I need to calculate from the equations. I need to find the smallest ||d|| which satisfies these equations, and || || means any norm of vection d. I plan to use fsolve to solve these equations but I encounter problems in writing the right form of these equations into matlab function handle. My idea is to build the single integration function by int and use for loop to get a N*N matrix M where the element is one single integration. Then I can sum the rows of this N*N matrix and add Z into it. By converting the final function to function handle (matlabFunction) and I can use fsolve. My current diffculty lies in writing the corrrect form of the single integration function. Can anyone give me a hint or tell me is there better idea to solve these equations?
Here is what i arrived
L=10;
interval=1;
x=[-L:interval:L-interval]; %make a x vector between 0 and 10 with 1 as interval
N=length(x);
Z=x.^2./10+0.5;
X=zeros(N);% xi-xj matrix
for i=1:N
for j=1:N
X(i,j)=x(i)-x(j);
end
end
fun=@(dw,xx) integral(@(t)-(a(1)+a(2).*exp(-t./a(3))).*(1-(xx).^2./(a(4)+a(5)*t).^2).^a(6),0, dw, 'ArrayValued',false);
d = sym('d',[1 N]);
D=repmat(d,N,1);% make int upper limit matrix
M = sym('M',[N N]);
for i=1:N
for j=1:N
M(i,j)=fun(D(i,j),X(i,j));
end
end
fun1=sum(M,2)+Z;
fun2=matlabFunction(fun1,'Vars',{[d(1),d(2),d(3),d(4),d(5),d(6),d(7),d(8),d(9),d(10),d(11),d(12),d(13),d(14),d(15),d(16),d(17),d(18),d(19),d(20)]});
d_0=zeros(N,1);
y=fsolve(fun2,d_0)
6 个评论
John D'Errico
2020-8-16
It is difficult to follow what you are doing, and understand what you want to do. For example, I see very early in your code:
x=[-L:interval:L-interval]; %make a x vector between 0 and 10 with 1 as interval
This in fact creates a vector that runs from -10 to +9, with a stride of 1. As such, completely inconsistent with your comment. I'll suppose it creates a vector, I can ignore why you did what you did.
If you have a recent release, thus R2016b or later, the matrix X can be simply created as just:
X = x - x.';
Again, that is irrelevant. But beyond that, what you did, and what you seem to be asking in your question look to diverge rather wildly.
As I try to understand your code and your question, looking back and reading what you have written in your question now leads me to a strange spot, where you are raising numbers to the power of a6, where a6 is 828.9618. And depending on the values of the variables inside, this will result in either underflows or overflows, thus effectively either 0, inf or -inf. Even though you were originally using symbolic variables for part of this, at this level you are still using double precision arithmetic because you are calling integral. And it will with very high probability fail to produce any meaningful result from this computation.
So at this point in your journey, I'll wish you good luck and godspeed, as you will need both in your quest.
回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Symbolic Math Toolbox 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!