Using Wolfram Alpha in a nested loop
- To: mathgroup at smc.vnet.net
- Subject: [mg129604] Using Wolfram Alpha in a nested loop
- From: Nicholas Martin <en51nm at gmail.com>
- Date: Tue, 29 Jan 2013 02:41:58 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
Hi, I'm very new to Mathematica, I just started using it a couple of days ago. I'm trying to write a small application to get data from WolframAlpha for different types of fluid and then store this data.
My problem at the moment is that if I want to create a 2D array of (for example) density, Cv and Cp of air for a range of 100 temperatures and pressures. That's 3*n^2 calls to Wolfram alpha, which will take a long time!
Is there any way speed up my code? I've included my code:
(*First find the max and min values of pressure and temperature in the location you are interested in and create the temperature and pressure lists:*)
presData = WeatherData[{"London", "UK"}, "Pressure", {{2000, 1, 1}, {2009, 12, 31}, "Day"}];
presData[[All, 2]] = 100 presData[[All, 2]];
baddata[entry_] := Not[MatchQ[entry, _?NumberQ]]; (*remove bad datapoints*)
pmax = Max[DeleteCases[presData[[All, 2]], _?baddata]];
pmin = Min[DeleteCases[presData[[All, 2]], _?baddata]];
tempData = WeatherData[{"London", "UK"}, "Temperature", {{2000, 1, 1}, {2009, 12, 31}, "Day"}];
absoluteZero = -WolframAlpha["absolute zero in celsius", {{"Result", 1}, "NumberData"}];
tempData[[All, 2]] = absoluteZero + tempData[[All, 2]]; (*convert to K*)
tmax = Max[DeleteCases[tempData[[All, 2]], _?baddata]];
tmin = Min[DeleteCases[tempData[[All, 2]], _?baddata] ];
stepnum = 100;
dt = (tmax - tmin)/stepnum;
dp = (pmax - pmin)/stepnum;
temps = Range[tmin, tmax, dt];
press = Range[pmin, pmax, dp];
createstring[prop_, fluid_, temp_, pres_] := ToString[prop] <> " of " <> ToString[fluid] <> " at " <> ToString[temp] <> "K and " <> ToString[pres] <> "Pa"
(*Now cycle through i temperatures and j pressures to get the Cp, density and Cv data for air:*)
Cp = Array[0, {stepnum, stepnum}];
rho = Array[0, {stepnum, stepnum}];
Cv = Array[0, {stepnum, stepnum}];
For[i = 1, i < stepnum + 1, i++,
For[j = 1, j < stepnum + 1, j++,
Print[{i, j}];
text = createstring["Cp", "air", temps[[i]], press[[j]]];
Print["Getting data for " <> ToString[text ]];
data = WolframAlpha[
ToString[text ], {{"UnitConversion", 3}, "NumberData"}];
Print[data];
Cp[[i, j]] = data;
text = createstring["density", "air", temps[[i]], press[[j]]];
Print["Getting data for " <> ToString[text ]];
data = WolframAlpha[ToString[text ], {{"Result", 1}, "NumberData"}];
Print[data];
rho[[i, j]] = data;
text = createstring["Cv", "air", temps[[i]], press[[j]]];
Print["Getting data for " <> ToString[text ]];
data = WolframAlpha[
ToString[text ], {{"UnitConversion", 3}, "NumberData"}];
Print[data];
Cv[[i, j]] = data;
]
]
ListContourPlot[rho]
ListContourPlot[Cp]
ListContourPlot[Cv]